Apa yang sedang dilakukan `params.require (: person) .permit (: name,: age)` di Rails 4?

149

Semua contoh parameter kuat dalam Rails 4 docs gunakan

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

Bisakah seseorang mendekonstruksi dan menjelaskan apa yang terjadi dengan requiredan di permitsini?

Erik Trautman
sumber
3
Contoh ini datang langsung dari dokumentasi, yang menjelaskan permittetapi tidak require.
Erik Trautman

Jawaban:

202

Di paramsdalam controller terlihat seperti Hash, tetapi sebenarnya merupakan instance dari ActionController::Parameters, yang menyediakan beberapa metode seperti requiredan permit.

The requireMetode memastikan bahwa parameter tertentu hadir, dan jika tidak disediakan, requiremetode melempar kesalahan. Ini mengembalikan instance ActionController::Parametersuntuk kunci yang dilewatkan require.

The permitMetode mengembalikan salinan dari objek parameter, kembali hanya diizinkan kunci dan nilai-nilai. Saat membuat model ActiveRecord baru, hanya atribut yang diizinkan yang dilewatkan ke dalam model.

Ini terlihat sangat mirip dengan daftar putih yang sebelumnya termasuk dalam model ActiveRecord, tetapi lebih masuk akal untuk berada di controller.

fivedigit
sumber
37
Deskripsi izin adalah sedikit off: izin kembali hash lain yang berisi hanya diizinkan kunci DAN (ini sangat penting) akan merespon dengan trueke permitted?metode. Secara default, sebuah instance dari ActionController::Parameterskelas akan kembali falseuntuk permitted?Menanggapi trueuntuk permitted?sarana objek parameter dapat digunakan dalam tugas massa; selain itu aplikasi akan melempar kesalahan ForbiddenAttributes.
Sama
3
Apakah chaining permitpada requirejuga mengizinkan dan termasuk parameter yang diperlukan dalam objek kembali?
Dennis
Saya menemukan penamaannya kurang menguntungkan, karena memerlukan banyak hal daripada membuat parameter yang diizinkan diperlukan. Menggunakan params.permit (: orang,: nama,: usia) tidak berfungsi, dan menghasilkan kesalahan seperti "Parameter yang tidak diijinkan:: utf8" untuk bentuk khas.
Damien
6

Untuk lebih tepatnya, ketika Anda membuat misalnya. perbuatan.new(...) , harus ada :personhash yang ditunjukkan oleh persyaratan dan hash orang hanya akan menerima :namedan :ageditunjukkan dengan izin.

Contoh:

.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
Bhojendra Rauniyar
sumber
Apa yang not okaydivisualisasikan oleh contoh 3 dan 4 ?
p0k8_
@ p0k8_ Saya mengedit jawaban untuk mengklarifikasi itu. Contoh-contoh itu menunjukkan beberapa nama bidang berbeda yang tidak "diizinkan".
Harry Wood