Преобразование пустых строк в nil перед сохранением

У меня есть следующая модель User, и я хочу убедиться, что никто не хранит пустые строки (например, пробел) в базе данных. Если кто-то вводит " " (несколько пробелов) для first_name, last_name или nickname, этот атрибут должен быть сохранен со значением nil. В Rails я бы решил эту проблему с помощью обратного вызова before_validation. Как лучше всего решить эту проблему в Фениксе?

defmodule MyApp.User do
  use MyApp.Web, :model

  schema "users" do
    field :first_name, :string
    field :last_name, :string
    field :nickname, :string

    timestamps
  end

  @required_fields ~w()
  @optional_fields ~w(first_name last_name nickname)

  @doc """
  Creates a changeset based on the `model` and `params`.

  If no params are provided, an invalid changeset is returned
  with no validation performed.
  """
  def changeset(model, params \\ :empty) do
    model
    |> cast(params, @required_fields, @optional_fields)
  end
end

person wintermeyer    schedule 30.04.2016    source источник
comment
Вы используете plug :scrub_params, "user", ... в UserController?   -  person Dogbert    schedule 30.04.2016
comment
Да. aaaahhh... stackoverflow.com/questions/33975229/ Спасибо!   -  person wintermeyer    schedule 30.04.2016
comment
@Dogbert Не могли бы вы опубликовать это как ответ?   -  person NoDisplayName    schedule 30.04.2016


Ответы (1)


Рекомендуется обрабатывать это в контроллере с помощью плагина scrub_params, который рекурсивно преобразует пустые строки (в том числе состоящие только из пробелов) в nils для заданного ключа.

Генераторы Phoenix вставляют следующий код в сгенерированный контроллер (если контроллер называется UserController):

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

Вы могли бы использовать что-то подобное.

person Dogbert    schedule 30.04.2016