Art*_*huk 1 ruby ruby-on-rails rails-activerecord
如何告诉Ruby(Rails)忽略大规模分配时存在的受保护变量?
class MyClass < ActiveRecord::Base
attr_accessible :name, :age
end
Run Code Online (Sandbox Code Playgroud)
现在我将批量分配一个哈希来创建一个新的MyClass.
MyClass.create!({:name => "John", :age => 25, :id => 2})
Run Code Online (Sandbox Code Playgroud)
这会给我一个例外:
ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: id
Run Code Online (Sandbox Code Playgroud)
我希望它MyClass使用指定的(不受保护的)属性创建一个新的并忽略该id属性.
旁注:我怎样才能忽略未知属性.例如,MyClass没有location属性.如果我尝试批量分配它,只需忽略它.
使用Hash#slice只选择你在分配真正感兴趣的键:
# Pass only :name and :age to create!
MyClass.create!(params.slice(:name, :age))
Run Code Online (Sandbox Code Playgroud)
通常,我会params向我的控制器添加包装器方法,将其过滤到我知道我想要分配的字段:
class MyController
# ...
def create
@my_instance = MyClass.create!(create_params)
end
protected
def create_params
params.slice(:name, :age)
end
end
Run Code Online (Sandbox Code Playgroud)