Подтвердить что ты не робот

Являются ли Phoenix scrub_params сильными параметрами Rails?

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

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

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

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

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

4b9b3361

Ответ 1

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

Параметры Scrub выполняют следующие действия:

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

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

plug scrub_params "user"

Будет проверять наличие ключа "пользователь". Из документов:

Если искомая_имя отсутствует, она поднимет Phoenix.MissingParamError.

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

%{"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 в требуемое поле приведет к аннулированию набора изменений и добавит ошибку для этого поля.