Rails 4'te `params.require (: person) .permit (: name,: age)` ne yapıyor?


152

Rails 4 belgelerindeki tüm güçlü parametre örnekleri şunları kullanır:

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

Biri lütfen burada requireve permitburada neler olduğunu parçalayıp açıklayabilir mi?


3
Bu örnek, açıklayan permitancak açıklamayan doğrudan dokümantasyondan gelir require.
Erik Trautman

Yanıtlar:


209

paramsBir Hash gibi bir kontrolör görünüyor, ama aslında bir örneği var ActionController::Parametersgibi birkaç yöntem sağlar, requireve permit.

requireYöntem sağlayan bir spesifik parametre mevcut olduğu, ve bu Resim değilse, bu requireyöntem, bir hata verir. Geçilen ActionController::Parametersanahtarın bir örneğini döndürür require.

permitYöntem anahtarlarını ve değerlerini izin sadece dönen, parametreler nesnenin bir kopyasını döndürür. Yeni bir ActiveRecord modeli oluştururken, modele yalnızca izin verilen öznitelikler aktarılır.

Daha önce ActiveRecord modellerinde bulunan beyaz listeye çok benziyor, ancak denetleyicide olması daha mantıklı.


40
Permit'in açıklaması biraz kapalı: permit, yalnızca izin verilen anahtarı içeren başka bir karma döndürür VE (bu kritiktir) yönteme yanıt trueverir permitted?. Varsayılan olarak, bir örneği ActionController::Parameterssınıfı döndürür falseiçin permitted?yanıt trueiçin permitted?parametre nesne kütle atama kullanılabilir aracı; aksi takdirde uygulama bir ForbiddenAttributes hatası verir.
2013

3
Zincirleme mu permitüzerinde requirede izin ve döndürülen nesne gerekli parametreleri içerir?
Dennis

İzin verilen bir parametreyi zorunlu kılmaktan çok daha fazlasını gerektirdiği için, isimlendirmeyi talihsiz buluyorum. Params.permit (: kişi,: ad,: yaş) kullanılması işe yaramaz ve tipik bir form için "İzin verilmeyen parametreler:: utf8" gibi hatalar oluşturur.
Damien

7

Daha kesin olmak gerekirse, örneğin için yarattığınızda. yapıyor .new(...), :persongereksinim tarafından belirtilen bir karma olmalıdır ve kişi karması yalnızca izinle kabul edecek :nameve :agegösterecektir.

Misal:

.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. ve 4. not okayörnek neyi görselleştiriyor?
p0k8_

@ p0k8_ Bunu açıklığa kavuşturmak için cevabı düzenledim. Bu örnekler, "izin verilmeyen" bazı farklı alan adlarını gösterir.
Harry Wood
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.