保存前将空字符串转换为nil

时间:2016-04-30 08:37:58

标签: elixir phoenix-framework

我有以下User模型,并希望确保没有人在数据库中存储空字符串(例如空格)。如果有人为first_namelast_namenickname输入“”(多个空格),则应使用值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

1 个答案:

答案 0 :(得分:4)

推荐的方法是使用scrub_params插件在控制器中处理此问题,该插件以递归方式将空字符串(包括仅由空格组成的字符串)转换为给定键的nil

Phoenix生成器在生成的控制器中插入以下代码(如果控制器名为UserController):

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

你可以使用类似的东西。