Що таке "params.require (: person) .permit (: ім'я,: вік)` у Rails 4?


149

Усі приклади сильних параметрів у документах Rails 4 використовуються

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

Може хтось, будь ласка, деконструює та пояснить, що відбувається з requireі permitтут?


3
Цей приклад походить безпосередньо з документації, яка пояснює, permitале ні require.
Ерік Траутман

Відповіді:


202

paramsУ контролері виглядає як Hash, але це на самому справі є екземпляром ActionController::Parameters, який надає кілька методів , таких як requireі permit.

У requireметоді гарантує , що конкретний параметр присутній, і якщо це не передбачено, то requireметод видає помилку. Він повертає екземпляр ActionController::Parametersключа, переданого в require.

permitМетод повертає копію об'єкта параметрів, повертаючи тільки дозволені ключі і значення. Створюючи нову модель ActiveRecord, в модель передаються лише дозволені атрибути.

Це дуже схоже на білі списки, які раніше були включені в моделі ActiveRecord, але має сенс бути в контролері.


37
Опис дозволу трохи недоступний: дозвіл повертає інший хеш, який містить лише дозволений ключ І (це критично важливо) відповість trueна permitted?метод. За замовчуванням екземпляр ActionController::Parametersкласу повернеться falseдля permitted?Responding, trueщо permitted?означає, що об'єкт параметра може бути використаний у масовому призначенні; інакше додаток видасть помилку ForbiddenAttributes.
1313

3
Є чи зчеплення permitна 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

Що not okayвізуалізують третій та четвертий приклад?
p0k8_

@ p0k8_ Я відредагував відповідь, щоб уточнити це. Ці приклади показують різні назви полів, які не були "дозволені".
Гаррі Вуд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.