web-dev-qa-db-ja.com

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

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

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

誰かがここでrequirepermitで何が起こっているのか解体して説明してもらえますか?

136
Erik Trautman

コントローラーのparamsはハッシュのように見えますが、実際には ActionController::Parameters のインスタンスであり、requirepermitなどのいくつかのメソッドを提供します。

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

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

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

179
fivedigit

より正確に言うと、例えば.new(...)を実行する場合、requireで示される:personハッシュが必要であり、personハッシュは許可で示される:nameおよび:ageのみを受け入れます。

例:

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