Co robi `params.require (: person) .permit (: name,: age)` w Railsach 4?

149

Wszystkie przykłady mocnych parametrów w dokumentach Rails 4 są używane

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

Czy ktoś mógłby zdekonstruować i wyjaśnić, co się dzieje z requirei permittutaj?

Erik Trautman
źródło
3
Ten przykład pochodzi bezpośrednio z dokumentacji, która wyjaśnia, permitale nie require.
Erik Trautman

Odpowiedzi:

202

W paramskontrolerze wygląda jak Hash, ale w rzeczywistości jest instancją ActionController::Parameters, która udostępnia kilka metod, takich jak requirei permit.

Te requiremetoda gwarantuje, że konkretny parametr jest obecny, a jeśli nie jest podana, requiremetoda wygeneruje błąd. Zwraca instancję ActionController::Parametersklucza przekazanego do require.

permitMetoda zwraca kopię obiektu parametrów, wracając tylko dozwolone klucze i wartości. Podczas tworzenia nowego modelu ActiveRecord do modelu przekazywane są tylko dozwolone atrybuty.

Wygląda bardzo podobnie do białej listy, która była wcześniej zawarta w modelach ActiveRecord, ale bardziej sensowne jest, aby znajdowała się w kontrolerze.

fivedigit
źródło
37
Opis zezwolenia jest nieco wyłączony: zezwolenie zwraca kolejny skrót, który zawiera tylko dozwolony klucz I (jest to krytyczne) odpowie truena permitted?metodę. Domyślnie instancja ActionController::Parametersklasy powróci falsedo permitted?reagowania truena permitted?drodze przedmiotem parametr może być stosowane w przypisania mas; w przeciwnym razie aplikacja zgłosi błąd ForbiddenAttributes.
sameers
3
Czy łańcuchowanie permitwłączone requirerównież pozwala i zawiera wymagane parametry w zwracanym obiekcie?
Dennis
Uważam, że nazewnictwo jest niefortunne, ponieważ require robi znacznie więcej niż wymaganie dozwolonego parametru. Używanie params.permit (: person,: name,: age) nie działa i generuje błędy, takie jak „Niedopuszczalne parametry:: utf8” dla typowego formularza.
Damien
6

Mówiąc dokładniej, gdy tworzysz np. robiąc .new(...), musi istnieć :personhash oznaczony wymaganiem, a osoba ta będzie akceptować :namei :agewskazywać na zezwolenie.

Przykład:

.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
źródło
Co not okaywizualizują trzeci i czwarty przykład?
p0k8_
@ p0k8_ Zmieniłem odpowiedź, aby to wyjaśnić. Te przykłady pokazują różne nazwy pól, które nie były „dozwolone”.
Harry Wood