Что `params.require (: person) .permit (: name,: age)` делает в Rails 4?

149

Все примеры сильных параметров в Rails 4 docs используют

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

Может ли кто-нибудь, пожалуйста, разобрать и объяснить, что происходит с requireи permitздесь?

Эрик Траутман
источник
3
Этот пример взят непосредственно из документации, которая объясняет, permitно не объясняет require.
Эрик Траутман

Ответы:

202

Контроллер paramsin выглядит как Hash, но на самом деле это экземпляр ActionController::Parameters, который предоставляет несколько методов, таких как requireи permit.

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

permitМетод возвращает копию объекта параметров, возвращая только разрешенные ключи и значения. При создании новой модели ActiveRecord в модель передаются только разрешенные атрибуты.

Он очень похож на белый список, который ранее был включен в модели ActiveRecord, но для него имеет больше смысла находиться в контроллере.

fivedigit
источник
37
Описание разрешения откусил: разрешение возвращает другой хэш , который содержит только разрешенный ключ И (это очень важно) будет реагировать trueна permitted?метод. По умолчанию экземпляр ActionController::Parametersкласса будет возвращен falseдля permitted?ответа, trueчто permitted?означает, что объект параметра может использоваться в массовом назначении; иначе приложение выдаст ошибку ForbiddenAttributes.
Самирс
3
Есть ли сцепление permitна requireтакже разрешает и включать требуемые параметры в возвращенном объекте?
Деннис
Я считаю, что присвоение имен неудачно, так как require делает намного больше, чем просто требует допустимый параметр. Использование params.permit (: person,: name,: age) не работает и генерирует ошибки типа «Unpermitted parameters:: 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визуализируют 3-й и 4-й пример?
p0k8_
@ p0k8_ Я отредактировал ответ, чтобы уточнить это. Эти примеры показывают несколько разных имен полей, которые не были «разрешены».
Гарри Вуд