Rails 4で `params.require(:person).permit(:name、:age)`は何をしているのですか?


149

Rails 4ドキュメントの強力なパラメータのすべての例で使用

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

誰かが解体とで何が起きているかを説明してもらえますrequireし、permitここに?


3
この例はドキュメントから直接来てpermitrequireます。
Erik Trautman、2013

回答:


202

paramsハッシュのようなコントローラのルックスで、それが実際のインスタンスのActionController::Parametersようないくつかの方法を提供、requireなどをpermit

このrequireメソッドは、特定のパラメーターが存在することを確認します。指定されていない場合、requireメソッドはエラーをスローします。にActionController::Parameters渡されたキーのインスタンスを返しますrequire

このpermitメソッドはパラメーターオブジェクトのコピーを返し、許可されたキーと値のみを返します。新しいActiveRecordモデルを作成すると、許可された属性のみがモデルに渡されます。

以前はActiveRecordモデルに含まれていたホワイトリストによく似ていますが、コントローラーに含める方が理にかなっています。


37
許可の説明は少しずれています。許可は、許可されたキーのみを含む別のハッシュを返し、かつ(これは重要です)truepermitted?メソッドに応答します。デフォルトでは、インスタンスのActionController::Parametersクラスが返されますfalseためにpermitted?応答trueするpermitted?パラメータオブジェクトは、質量割り当てに使用できることを意味します。そうでない場合、アプリはForbiddenAttributesエラーをスローします。
sameers

3
チェーニングをpermitオンrequireにすると、必要なパラメーターが許可され、返されるオブジェクトに含まれますか?
Dennis

requireは許可されたパラメーターを必須にするよりもはるかに多くのことをしているので、命名は残念です。params.permit(:person、:name、:age)を使用しても機能せず、一般的なフォームで「許可されていないパラメーター::utf8」などのエラーが生成されます。
ダミアン

6

より正確に言うと、たとえば、やって.new(...)、そこにする必要があり:person、ハッシュが必要と人のハッシュのみを受け入れるで示さ:name及び:age許可証で示されます。

例:

.new(person: { name: "Bhojendra", age: 32 }) // okay
.new(person: { name: "Rauniyar" }) // okay
.new(person: { name: "Bhojendra", other: 'asdf' }) // not okay, other not permitted
.new(person: { full_name: "Bhojendra Rauniyar" }) // not okay, full_name not permitted
.new(detail: { name: "Bhojendra", age: 32 }) // not okay, must be person

3番目と4番目のnot okay例は何を視覚化しますか?
p0k8_

@ p0k8_わかりやすくするために回答を編集しました。これらの例は、「許可」されなかったいくつかの異なるフィールド名を示しています。
ハリーウッド、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.