Answers:
Rails 4现在使用强参数。
保护属性现在在控制器中完成。这是一个例子:
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
关键字是不言自明的,但以防万一,您可以在Rails Action Controller指南中找到有关强参数的更多信息。
注意:如果您仍要使用attr_accessible
,则需要添加protected_attributes
到Gemfile
。否则,您将面临RuntimeError
。
RuntimeError in MicropostsController#index 'attr_accessible' is extracted out of Rails into a gem. Please use new recommended protection model for params(strong_parameters) or add 'protected_attributes' to your Gemfile to use old one.
如果您更喜欢attr_accessible,也可以在Rails 4中使用它。您应该像gem一样安装它:
gem 'protected_attributes'
之后,您可以像在Rails 3中一样在模型中使用attr_accessible
另外,我认为这是最好的方法-使用表单对象处理批量分配并保存嵌套对象,并且您还可以通过这种方式使用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
Rails 5的更新:
gem 'protected_attributes'
似乎不再工作了。但是给:
宝石'protected_attributes_continued'
尝试一下。
attr_accessible
需要删除。如果我们坚持下去会怎样?