在Rails 4中如何使用attr_accessible?


Answers:


447

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_attributesGemfile。否则,您将面临RuntimeError


1
该文件没有说attr_accessible需要删除。如果我们坚持下去会怎样?
lulalala

12
如果不对Gemfile进行一些调整,则会出现错误。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.
用户

6
很好的解释。但是,实际上在实践中,这似乎使Rails从胖模型,瘦控制器等转向了瘦模型,甚至是肿的控制器。您必须为每个实例编写所有这些内容,但读取效果不佳,嵌套似乎很麻烦。模型系统中的旧attr_accessible / attr_accessor未被破坏,不需要修复。在这种情况下,一篇博客文章太受欢迎了。
rcd

1
您不必在控制器中处理允许的参数。实际上,这违反了单一责任原则。请看以下博客文章edelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois 2014年

3
因此,反复无常且频繁更改的api,再加上新发现的pedantics,在另一个痛苦的Rails升级中浪费了很多开发人员时间:-(
Brian Takita 2015年

22

如果您更喜欢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

1
当您使用“强参数”时,会在控制器层中过滤参数,我认为这对所有应用程序都不是最好的主意。对我来说,过滤参数的最佳方法是使用附加层。我们可以使用“ protected_attributes” gem来编写这一层
edikgat 2014年

4

我们可以用

params.require(:person).permit(:name, :age)

如果人员是模型,则可以在方法person_params上传递此代码,并在create方法或else方法中代替params [:person]


2

Rails 5的更新:

gem 'protected_attributes' 

似乎不再工作了。但是给:

宝石'protected_attributes_continued'

尝试一下。


1

1)更新Devise,使其可以通过将以下行添加到应用程序的Gemfile中来处理Rails 4.0:

gem 'devise', '3.0.0.rc' 

然后执行:

$ bundle

2)将旧功能attr_accessible再次添加到Rails 4.0

尝试使用attr_accessible,不要对此发表评论。

将此行添加到应用程序的Gemfile中:

gem 'protected_attributes'

然后执行:

$ bundle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.