123456789_123456789_123456789_123456789_123456789_

Module: ActiveModel::AttributeAssignment

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
Defined in: activemodel/lib/active_model/attribute_assignment.rb

Instance Attribute Summary

Instance Method Summary

ForbiddenAttributesProtection - Included

Instance Attribute Details

#attributes=(new_attributes) (writeonly)

Alias for #assign_attributes.

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_assignment.rb', line 37

alias attributes= assign_attributes

Instance Method Details

#_assign_attribute(k, v) (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_assignment.rb', line 67

def _assign_attribute(k, v)
  setter = :"#{k}="
  public_send(setter, v)
rescue NoMethodError
  if respond_to?(setter)
    raise
  else
    attribute_writer_missing(k.to_s, v)
  end
end

#_assign_attributes(attributes) (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_assignment.rb', line 61

def _assign_attributes(attributes)
  attributes.each_pair do |k, v|
    _assign_attribute(k, v)
  end
end

#assign_attributes(new_attributes) Also known as: #attributes=

Allows you to set all the attributes by passing in a hash of attributes with keys matching the attribute names.

If the passed hash responds to permitted? method and the return value of this method is false an ForbiddenAttributesError exception is raised.

class Cat
  include ActiveModel::AttributeAssignment
  attr_accessor :name, :status
end

cat = Cat.new
cat.assign_attributes(name: "Gorby", status: "yawning")
cat.name # => 'Gorby'
cat.status # => 'yawning'
cat.assign_attributes(status: "sleeping")
cat.name # => 'Gorby'
cat.status # => 'sleeping'
[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_assignment.rb', line 28

def assign_attributes(new_attributes)
  unless new_attributes.respond_to?(:each_pair)
    raise ArgumentError, "When assigning attributes, you must pass a hash as an argument, #{new_attributes.class} passed."
  end
  return if new_attributes.empty?

  _assign_attributes(sanitize_for_mass_assignment(new_attributes))
end

#attribute_writer_missing(name, value)

Like BasicObject#method_missing, #attribute_writer_missing is invoked when #assign_attributes is passed an unknown attribute name.

By default, #attribute_writer_missing raises an UnknownAttributeError.

class Rectangle
  include ActiveModel::AttributeAssignment

  attr_accessor :length, :width

  def attribute_writer_missing(name, value)
    Rails.logger.warn "Tried to assign to unknown attribute #{name}"
  end
end

rectangle = Rectangle.new
rectangle.assign_attributes(height: 10) # => Logs "Tried to assign to unknown attribute 'height'"
[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_assignment.rb', line 56

def attribute_writer_missing(name, value)
  raise UnknownAttributeError.new(self, name)
end