在Rails 4中如何使用attr_accessible?
attr_accessible
似乎不再在我的模型中工作。
在Rails 4中允许批量分配的方法是什么?
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指南中find有关强参数的更多信息。
注意 :如果你仍然想使用attr_accessible
,你需要添加protected_attributes
到你的Gemfile
。 否则,你将面临一个RuntimeError
。
如果你喜欢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
我们可以用
params.require(:person).permit(:name, :age)
如果person是Model,那么可以通过person_params方法传递此代码,并在create方法或其他方法中使用params [:person]
1)更新devise,以便它可以通过将这一行添加到应用程序的Gemfile来处理Rails 4.0:
gem 'devise', '3.0.0.rc'
然后执行:
$ bundle
2)将attr_accessible
的旧function再次添加到rails 4.0
尝试使用attr_accessible
,不要评论这一点。
将此行添加到应用程序的Gemfile中:
gem 'protected_attributes'
然后执行:
$ bundle