7

我在我的 Rails 应用程序中设置了一个 ActiveModel 类,如下所示:

class MyThingy
   extend ActiveModel::Naming
   extend ActiveModel::Translation
   include ActiveModel::Validations
   include ActiveModel::Conversion

   attr_accessor :username, :favorite_color, :stuff

   def initialize(params)
     #Set up stuff
   end

end

我真的希望能够做到这一点:

thingy = MyThingy.new(params)
thingy.update_attributes(:favorite_color => :red, :stuff => 'other stuff')

我可以自己编写 update_attributes,但我感觉它存在于某个地方。可以?

4

2 回答 2

7

不,但这种情况有一个共同的模式:

class Customer
  include ActiveModel::MassAssignmentSecurity

  attr_accessor :name, :credit_rating

  attr_accessible :name
  attr_accessible :name, :credit_rating, :as => :admin

  def assign_attributes(values, options = {})
    sanitize_for_mass_assignment(values, options[:as]).each do |k, v|
      send("#{k}=", v)
    end
  end
end

来自这里。有关示例,请参见链接。

如果您发现自己经常重复这种方法,您可以将此方法提取到一个单独的模块中,并根据需要包含它。

于 2012-06-11T07:03:00.117 回答
0

看起来他们将其从活动记录中拉出并移至 Rails 5 中的活动模型。

http://api.rubyonrails.org/classes/ActiveModel/AttributeAssignment.html#method-i-assign_attributes

您应该能够包含该模块:

include ActiveModel::AttributeAssignment
于 2016-09-30T19:55:49.063 回答