在Ecto中写入db之前更新用户提供的参数

时间:2015-04-30 21:57:08

标签: elixir

这是我的用户模型

  @required_fields ~w(name email hashed_password)
  @optional_fields ~w()

  def changeset(model, params \\ nil) do
    model
    |> cast(params, @required_fields, @optional_fields)
    |> validate_length(:password, min: 6)
    |> hash_password(params["password"])
  end

  def hash_password(changeset, password) do
    put_change(changeset, :hashed_password, Bcrypt.hashpwsalt(password))
  end

这是控制器的代码

changeset = User.changeset(%User{}, user_params)

我试图理解为什么验证没有通过,我得到hashed_password: "can't be blank"

%Ecto.Changeset{
  changes: %{
    email: "user@mail.com",
    hashed_password: "$2b$12$6m6nlvykDzvvqgJQswAcxuu96./P2q/ToRRK0mKC//ITp9H6eFeH6",
    name: "user"
  },
  errors: [hashed_password: "can't be blank"]
  ...
 }

我看到hashed_password已添加到:changes,但此错误从何而来?

1 个答案:

答案 0 :(得分:4)

您需要在hashed_password的变更集中插入字段之前hash_password/2字段的存在。 cast/4会返回一个包含"can't be blank"错误的新变更集,因为在调用时,hashed_password字段在参数中不是

您可能要做的是用hashed_password字段替换 required 字段中的password字段。这样,您需要password字段位于控制器传递的参数中。

您不需要hashed_password字段,因为您已手动将其放入变更集中,因此您确定它会在那里。