強力なパラメーターとattr_accessible
は、Rails の「大量割り当て」機能にセキュリティ保護を追加する 2 つの異なる方法です。強力なパラメーターは、Rails の現在のバージョンで規定されている方法です。
「一括代入」は Rails の便利な省略形で、1 つのステートメントでモデルの多くのプロパティを設定できます。
たとえば@user
、フォーム送信からのデータで更新したい があるとします。一括代入がなければ、次のような面倒なコードを書かなければなりません:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
そして、すべてのフォームフィールドで何度も。
一括代入を使用すると、そのコードはすべて 1 行になります。
@user.update(params[:user])
しかし、これにはセキュリティホールがいっぱいです。ブラウザによって送信されたデータが含まれているためparams
、悪意のあるユーザーが予期しないデータをその送信に追加する可能性があります。たとえばis_admin=1
、パラメータに追加できます。データベース列がある場合is_admin
、一括割り当てでは、ユーザーが管理者にアップグレードされるだけです。うわぁ!
ここでストロング パラメータの出番です。ストロング パラメータを使用するActiveModel::ForbiddenAttributesError
と、ナイーブを実行しようとするとRails が a を発生させますupdate(params[:user])
。代わりに、強力なパラメーターが提供するrequire
およびヘルパーを使用して、ブラウザーの送信から期待するパラメーターを明示する必要があります。permit
このような:
def user_params
# Note that :is_admin is not permitted!
params.require(:user).permit(:first_name, :last_name, :phone_number)
end
...
@user.update(user_params)
Rails のメンテナーを代弁することはできませんが、Strong Parameters は柔軟なので気に入っています。ユーザー コントローラーに異なるパラメーターを必要とする複数のアクションがある場合、permit
許可する必要があるパラメーターを使用して簡単に記述できます。
または、さまざまな属性を更新できるさまざまなユーザー ロールがある場合、それらの権限を簡単にモデル化できます。@CV-Gate が述べたように、実行時にこれらのアクセス許可を変更することもできます。これは強力です。
要するに、Strong Parameters の柔軟性は、そのuser_params
メソッドをどこでも好きなように定義できるという事実によるものです。Ruby と OO の概念を最大限に活用して、思いどおりに機能させることができます。
どうattr_accessible
ですか?
あまり詳細には触れませんが (この機能は Rails でサポートされなくなったため)、permit
メソッドを使用する代わりattr_accessible
に、モデル自体でマクロを使用して、次のように同様のことを行います。
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
したがって、単純なケースでは、Strong Parameters と非常によく似た動作をします。別の場所で属性のリストを定義するだけです。
ただし、attr_accessible
モデル クラスの定義と強く結びついているため、多くの柔軟性が失われます。User
同じモデルに対して一括割り当てを行う必要がある 2 つの異なるコントローラー アクションがある場合はどうなるでしょうか? 今、あなたは立ち往生しています。
attr_accessor
attr_accessor
マクロは Ruby に組み込まれており、Rails、一括代入、またはセキュリティとは何の関係もありません。たまたま名前が似ているだけです。:)