如何在Rails 4中使用attr_accessible?

use*_*974 257 ruby-on-rails ruby-on-rails-4

attr_accessible 似乎不再适用于我的模型.

在Rails 4中允许批量分配的方法是什么?

Pie*_*ois 444

Rails 4现在使用强参数.

现在,在控制器中完成保护属性.这是一个例子:

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end
Run Code Online (Sandbox Code Playgroud)

无需再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
Run Code Online (Sandbox Code Playgroud)

关键字是不言自明的,但为了以防万一,您可以在Rails Action Controller指南中找到有关强参数的更多信息.

注意:如果您仍想使用attr_accessible,则需要添加protected_attributes到您的Gemfile.否则,你将面临一个RuntimeError.

  • 如果您不对Gemfile进行一些调整,则会出现错误.`MicropostsController中的RuntimeError #index'attr_accessible'从Rails中提取到gem中.请使用新推荐的params保护模型(strong_parameters)或将'protected_attributes'添加到您的Gemfile中以使用旧的. (12认同)
  • 很棒的解释.然而,在实践中,这似乎使Rails远离胖模型,薄控制器等,并且转向薄模型,以及真正臃肿的控制器.你必须为每个实例编写所有这些东西,它不能很好地阅读,嵌套似乎很痛苦.模型系统中的旧attr_accessible/attr_accessor没有被破坏,也不需要修复.在这种情况下,一篇博文过于流行. (6认同)
  • 所以gimmiky和经常变化的apis,加上新发现的迂腐,浪费了许多开发人员的时间,在另一个痛苦的Rails升级:-( (3认同)

edi*_*gat 22

如果你更喜欢attr_accessible,你也可以在Rails 4中使用它.你应该像gem一样安装它:

gem 'protected_attributes'
Run Code Online (Sandbox Code Playgroud)

之后,您可以在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
Run Code Online (Sandbox Code Playgroud)


小智 6

Rails 5 的更新:

gem 'protected_attributes' 
Run Code Online (Sandbox Code Playgroud)

似乎不再起作用了。但给:

宝石'protected_attributes_continued'

尝试一下。