在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