2017-06-14 22:45:15 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-08-06 12:38:02 -04:00
|
|
|
require "active_support/core_ext/hash/keys"
|
2015-01-23 06:57:34 -05:00
|
|
|
|
|
|
|
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'
|
2017-05-30 22:21:51 -04:00
|
|
|
# cat.status # => 'yawning'
|
2015-01-23 06:57:34 -05:00
|
|
|
# cat.assign_attributes(status: "sleeping")
|
|
|
|
# cat.name # => 'Gorby'
|
2017-05-30 22:21:51 -04:00
|
|
|
# cat.status # => 'sleeping'
|
2015-01-23 06:57:34 -05:00
|
|
|
def assign_attributes(new_attributes)
|
|
|
|
if !new_attributes.respond_to?(:stringify_keys)
|
2017-09-21 12:07:06 -04:00
|
|
|
raise ArgumentError, "When assigning attributes, you must pass a hash as an argument, #{new_attributes.class} passed."
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
2017-04-02 00:42:14 -04:00
|
|
|
return if new_attributes.empty?
|
2015-01-23 06:57:34 -05:00
|
|
|
|
|
|
|
attributes = new_attributes.stringify_keys
|
|
|
|
_assign_attributes(sanitize_for_mass_assignment(attributes))
|
|
|
|
end
|
|
|
|
|
2018-02-28 05:54:42 -05:00
|
|
|
alias attributes= assign_attributes
|
|
|
|
|
2015-01-23 06:57:34 -05:00
|
|
|
private
|
2016-08-06 13:55:02 -04:00
|
|
|
def _assign_attributes(attributes)
|
|
|
|
attributes.each do |k, v|
|
|
|
|
_assign_attribute(k, v)
|
|
|
|
end
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
|
2016-08-06 13:55:02 -04:00
|
|
|
def _assign_attribute(k, v)
|
2017-06-14 22:45:15 -04:00
|
|
|
setter = :"#{k}="
|
2017-06-13 20:13:26 -04:00
|
|
|
if respond_to?(setter)
|
|
|
|
public_send(setter, v)
|
2016-08-06 13:55:02 -04:00
|
|
|
else
|
|
|
|
raise UnknownAttributeError.new(self, k)
|
|
|
|
end
|
2015-01-23 06:57:34 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|