这是我的用户模型
@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
,但此错误从何而来?
答案 0 :(得分:4)
您需要在hashed_password
的变更集中插入字段之前hash_password/2
字段的存在。 cast/4
会返回一个包含"can't be blank"
错误的新变更集,因为在调用时,hashed_password
字段在参数中不是。
您可能要做的是用hashed_password
字段替换 required 字段中的password
字段。这样,您需要password
字段位于控制器传递的参数中。
您不需要hashed_password
字段,因为您已手动将其放入变更集中,因此您确定它会在那里。