Module: Mobility::Backend::ActiveModel::Dirty::ClassMethods

Defined in:
lib/mobility/backend/active_model/dirty.rb

Overview

Adds hook after Setup#setup_model to add dirty-tracking methods for translated attributes onto model class.

Instance Method Summary collapse

Instance Method Details

#setup_model(model_class, attributes, **options) ⇒ Object

Call setup block on a class with attributes and options.

Parameters:

  • model_class

    Class to be setup-ed

  • attributes (Array<String>)
  • options (Hash)


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/mobility/backend/active_model/dirty.rb', line 46

def setup_model(model_class, attributes, **options)
  super
  model_class.class_eval do
    %w[changed? change was will_change! previously_changed? previous_change].each do |suffix|
      attributes.each do |attribute|
        class_eval <<-EOM, __FILE__, __LINE__ + 1
          def #{attribute}_#{suffix}
            attribute_#{suffix}("#{attribute}_#\{Mobility.locale\}")
          end
        EOM
      end
    end
  end

  restore_methods = Module.new do
    attributes.each do |attribute|
      locale_accessor = "#{attribute}_#{Mobility.locale}"
      define_method "restore_#{attribute}!" do
        if attribute_changed?(locale_accessor)
          __send__("#{attribute}=", changed_attributes[locale_accessor])
        end
      end
    end

    define_method :restore_attribute! do |attr|
      if attributes.include?(attr.to_s)
        send("restore_#{attr}!")
      else
        super(attr)
      end
    end
    private :restore_attribute!
  end
  model_class.include restore_methods
end