Похожи ли скраб_парамс Phoenix на сильные параметры Rails?

Документация по методу Phoenix scrub_params мне немного непонятна. Похоже, что эта функциональность похожа на функцию сильных параметров Rails. Однако, когда вы используете его в таком контроллере,

plug :scrub_params, "user" when action in [:create]

... вы явно не указываете, какие параметры вы хотите внести в белый список. Я просмотрел код для scrub_params, но я достаточно нуб с Эликсиром, чтобы не совсем понять, что происходит.

Этот метод просто смотрит на модель и использует обязательные и необязательные атрибуты модуля поля для параметров белого списка?

Кроме того, в документации scrub_params говорится: «Проверяет наличие требуемого ключа». Что такое «необходимый ключ»? Это только обязательные поля из модели?


person Elliot Larson    schedule 28.11.2015    source источник


Ответы (1)


Функция scrub_params/2 на самом деле не похожа на сильные параметры Rails. В Ecto вы определяете разрешенный ключ в своей функции набора изменений, используя Ecto.Changeset.cast/4.

Параметры скраба делают следующее:

  • Убедитесь, что требуемый ключ существует.
  • Измените пустые значения из карты в параметрах с нужным ключом на nil

Например, вызов:

plug scrub_params "user"

Проверит наличие «пользовательского» ключа. Из документов:

Если required_key отсутствует, он вызовет Phoenix.MissingParamError.

Если у вас есть карта параметров, которая выглядит так:

%{"user" => %{"name" => "foo", "age" => ""}}

Тогда параметр «возраст» будет преобразован в nil. Это позволяет вам вызывать вашу функцию набора изменений напрямую с параметрами:

def create(conn, %{"user" => user_params}) do
  User.changeset(user_params)
end

scrub_params/2 совершенно не связана с вашей моделью, она просто хорошо работает с Ecto, поскольку функция Ecto.Changeset.cast/4 принимает набор обязательных полей и набор необязательных полей. Передача nil обязательному полю сделает набор изменений недействительным и добавит ошибку для поля.

person Gazler    schedule 28.11.2015
comment
Спасибо за разъяснение. Это имеет смысл. - person Elliot Larson; 29.11.2015
comment
Итак, что эквивалентно сильным параметрам в Phoenix? Мне нужно ограничить ввод пользователя. Ценю ответ на мой вопрос здесь. Спасибо. - person Kevin Y; 09.10.2016