Ruby - 忽略受保护的属性

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属性.如果我尝试批量分配它,只需忽略它.

mea*_*gar 5

使用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)

  • 所以?这就是重点.您只接受您*了解的变量.你*不知道的变量是曾经被削减的变量,你正在切断并使用你*做*知道的变量. (2认同)