22

Railsでの一括割り当てについて、何人かの人が不満を言ったり質問を投稿したりしているのを聞いたことがあります。同じエラーが数回発生しましたが、実行したのはattr_accessible。しかし、大量割り当てとは正確には何ですか?誰かが例を挙げて説明できますか?

4

1 に答える 1

45

Mass Assignmentは、Rails がパラメーター ハッシュを使用してオブジェクトを構築する行為に付けた名前です。単一の代入演算子を介して複数の値を属性に割り当てるという点で、これは「一括代入」です。

次のスニペットは、モデルのnameandtopic属性の一括割り当てを実行します。Post

Post.new(:name => "John", :topic => "Something")
Post.create(:name => "John", :topic => "Something")
Post.update_attributes(:name => "John", :topic => "Something")

これが機能するためには、モデルで、渡すハッシュの各属性に一括割り当てを許可する必要があります。

これが失敗する 2 つの状況があります。

  • を含まないattr_accessible宣言があります:name
  • を含むがattr_protectedあります:name

attr_accessible最近、一括割り当てを成功させるために、属性を手動でホワイトリストに登録する必要があることがデフォルトになりました。attr_protectedこれ以前は、属性が明示的にブラックリストに登録されているか、他の属性がホワイトリストに登録されていない限り、デフォルトでは属性が割り当て可能でした。attr_acessible.

次のようなコードは非常に一般的であるため、一括割り当てできる属性を検討することが重要です。

@post = Post.new(params[:post])

通常、これは、 によってレンダリングされたフォームをユーザーが送信するときに使用されますform_for @post。理想的な世界では、params[:post]ハッシュにはフォームに表示されたフィールドのみが含まれている必要があります。ただし、ユーザーがリクエストで追加のフィールドを渡すのは簡単です。そのため、実際には、フォームに表示されるフィールドだけでなく、ユーザーが任意のフィールドを設定できるようにします。@post

大量割り当てを安全に使用しないと、いくつかのかなり大きな Rails アプリケーションで注目を集めるバグがいくつか発生します。たとえば、誰かが自分の公開鍵を Github リポジトリの信頼できる鍵のリストに挿入し、リポジトリにコードを直接プッシュすることを許可したバグです。にアクセスするべきではありませんでした。

于 2012-08-03T18:26:41.140 に答える