Method: ActiveSupport::CurrentAttributes.attribute

Defined in:
lib/active_support/current_attributes.rb

.attribute(*names, default: NOT_SET) ⇒ Object

Declares one or more attributes that will be given both class and instance accessor methods.

Options

  • :default - The default value for the attributes. If the value is a proc or lambda, it will be called whenever an instance is constructed. Otherwise, the value will be duplicated with #dup. Default values are re-assigned when the attributes are reset.



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/active_support/current_attributes.rb', line 115

def attribute(*names, default: NOT_SET)
  invalid_attribute_names = names.map(&:to_sym) & INVALID_ATTRIBUTE_NAMES
  if invalid_attribute_names.any?
    raise ArgumentError, "Restricted attribute names: #{invalid_attribute_names.join(", ")}"
  end

  Delegation.generate(singleton_class, names, to: :instance, nilable: false, signature: "")
  Delegation.generate(singleton_class, names.map { |n| "#{n}=" }, to: :instance, nilable: false, signature: "value")

  ActiveSupport::CodeGenerator.batch(generated_attribute_methods, __FILE__, __LINE__) do |owner|
    names.each do |name|
      owner.define_cached_method(name, namespace: :current_attributes) do |batch|
        batch <<
          "def #{name}" <<
          "@attributes[:#{name}]" <<
          "end"
      end
      owner.define_cached_method("#{name}=", namespace: :current_attributes) do |batch|
        batch <<
          "def #{name}=(value)" <<
          "@attributes[:#{name}] = value" <<
          "end"
      end
    end
  end

  self.defaults = defaults.merge(names.index_with { default })
end