Rails 4でattr_accessibleはどのように使用されますか?


258

attr_accessible 私のモデルでは機能しなくなったようです。

Rails 4で一括割り当てを許可する方法は何ですか?

回答:


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アクションコントローラガイドで強力なパラメータの詳細を確認できます。

:引き続き使用する場合はattr_accessible、にを追加protected_attributesする必要がありますGemfile。それ以外の場合は、が表示されますRuntimeError


1
文書はそれattr_accessibleが削除される必要があると言っていませんでした。それを守ったらどうなるの?
lulalala 2013

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は壊れていなかったため、修正する必要はありませんでした。この場合、1つのブログ投稿の人気が高まりすぎました。
rcd 14

1
コントローラーで許可されたパラメーターを処理する必要はありません。実際、それは単一責任の原則の違反です。次のブログ投稿をご覧くださいedelpero.svbtle.com/strong-parameters-the-right-way
Pierre-Louis Gottfrois

3
非常に奇妙で頻繁に変更されるAPIと、新たに発見された知識の組み合わせにより、さらに面倒なRailsアップグレードで多くの開発者の時間が無駄になりました:-(
Brian

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

4

使用できます

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

personがModelの場合、このコードをメソッドperson_paramsに渡し、createメソッドまたはelseメソッドのparams [:person]の代わりに使用できます。


2

Rails 5のアップデート:

gem 'protected_attributes' 

もう動作していないようです。しかし与える:

gem 'protected_attributes_contined'

試してみてください。


1

1)アプリケーションのGemfileに次の行を追加して、Rails 4.0を処理できるようにDeviseを更新します。

gem 'devise', '3.0.0.rc' 

次に実行します:

$ bundle

2)の古い機能attr_accessibleをRails 4.0に追加します

使用attr_accessibleしてコメントアウトしないでください。

次の行をアプリケーションのGemfileに追加します。

gem 'protected_attributes'

次に実行します:

$ bundle
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.