如何在Rails 4中使用attr_accessible?

时间:2013-06-28 18:28:25

标签: ruby-on-rails ruby-on-rails-4

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

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

4 个答案:

答案 0 :(得分:443)

Rails 4现在使用strong parameters

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

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

关键字不言自明,但为了以防万一,您可以找到有关强参数in the Rails Action Controller guide的更多信息。

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

答案 1 :(得分:22)

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

答案 2 :(得分:4)

我们可以使用

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

如果person是Model,您可以在方法person_params&amp;上传递此代码。在create method或else方法中使用params [:person]代替

答案 3 :(得分:0)

Rails 5的更新:

gem 'protected_attributes' 

似乎不再工作了。但给:

gem'protected_attributes_continued'

尝试。