attr_accessible
似乎已不再适用于我的模型。
在Rails 4中允许批量分配的方法是什么?
答案 0 :(得分:443)
Rails 4现在使用strong parameters。
现在在控制器中完成保护属性。这是一个例子:
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
private
def person_params
params.require(:person).permit(:name, :age)
end
end
无需再在模型中设置attr_accessible
。
accepts_nested_attributes_for
为了使用具有强参数的accepts_nested_attribute_for
,您需要指定哪些嵌套属性应列入白名单。
class Person
has_many :pets
accepts_nested_attributes_for :pets
end
class PeopleController < ApplicationController
def create
Person.create(person_params)
end
# ...
private
def person_params
params.require(:person).permit(:name, :age, pets_attributes: [:name, :category])
end
end
关键字不言自明,但为了以防万一,您可以找到有关强参数in the Rails Action Controller guide的更多信息。
注意:如果您仍想使用attr_accessible
,则需要将protected_attributes
添加到Gemfile
。否则,您将面临RuntimeError
。
答案 1 :(得分:22)
如果你更喜欢attr_accessible,你也可以在Rails 4中使用它。 你应该像gem一样安装它:
gem 'protected_attributes'
之后你可以在你的模型中使用attr_accessible,就像在Rails 3中一样
此外,我认为这是最好的方法 - 使用表单对象来处理质量分配,保存嵌套对象,你也可以使用protected_attributes gem
class NestedForm
include ActiveModel::MassAssignmentSecurity
attr_accessible :name,
:telephone, as: :create_params
def create_objects(params)
SomeModel.new(sanitized_params(params, :create_params))
end
end
答案 2 :(得分:4)
我们可以使用
params.require(:person).permit(:name, :age)
如果person是Model,您可以在方法person_params&amp;上传递此代码。在create method或else方法中使用params [:person]代替
答案 3 :(得分:0)
Rails 5的更新:
gem 'protected_attributes'
似乎不再工作了。但给:
gem'protected_attributes_continued'
尝试。