mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
![Robin Dupret](/assets/img/avatar_default.png)
The name `ActiveModel::AttributeAssignment::UnknownAttributeError` is too implementation specific so let's move the constant directly under the ActiveModel namespace. Also since this constant used to be under the ActiveRecord namespace, to make the upgrade path easier, let's avoid raising the former constant when we deal with this error on the Active Record side.
52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
require 'active_support/core_ext/hash/keys'
|
|
|
|
module ActiveModel
|
|
module AttributeAssignment
|
|
include ActiveModel::ForbiddenAttributesProtection
|
|
|
|
# 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 <tt>permitted?</tt> method and the return value
|
|
# of this method is +false+ an <tt>ActiveModel::ForbiddenAttributesError</tt>
|
|
# 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'
|
|
def assign_attributes(new_attributes)
|
|
if !new_attributes.respond_to?(:stringify_keys)
|
|
raise ArgumentError, "When assigning attributes, you must pass a hash as an argument."
|
|
end
|
|
return if new_attributes.blank?
|
|
|
|
attributes = new_attributes.stringify_keys
|
|
_assign_attributes(sanitize_for_mass_assignment(attributes))
|
|
end
|
|
|
|
private
|
|
|
|
def _assign_attributes(attributes)
|
|
attributes.each do |k, v|
|
|
_assign_attribute(k, v)
|
|
end
|
|
end
|
|
|
|
def _assign_attribute(k, v)
|
|
if respond_to?("#{k}=")
|
|
public_send("#{k}=", v)
|
|
else
|
|
raise UnknownAttributeError.new(self, k)
|
|
end
|
|
end
|
|
end
|
|
end
|