当一个新用户注册时,我想默认给他一个gravatar配置文件图像,之后他应该能够手动设置它,所以只有在profile_img_url为零时才能应用changeset方法
def changeset(model, params \\ :empty) do
model
|> cast(...)
...
|> get_gravatar
end
defp get_gravatar(current_changeset) do
case current_changeset do
%Ecto.Changeset{valid?: true, *is_nil:* :profile_img_url} ->
put_change(current_changeset, :profile_img_url, get_somehow_the_gravatar_img(current_changeset))
_ -> current_changeset
end
end
所以基本上,问题是,这是正确的方法,并且有一个Ecto mehtod来检查值是否为零。 (不仅在变更集中,而且在数据库中)
答案 0 :(得分:2)
找到一个解决方案,但我不会将其标记为已被接受,让其他人提出更好的建议。
defp get_gravatar(current_changeset) do
case current_changeset do
%Ecto.Changeset{valid?: true, model: %{profile_img_url: nil, email: email}} ->
put_change(current_changeset, :profile_img_url, to_string(Gravatar.new(email)) <> "?d=identicon")
_ -> current_changeset
end
end
答案 1 :(得分:2)
根据我目前的理解,您的实施是最新的,您可以使用另一种代码风格
def get_gravatar changeset do
if changeset.valid? && !(get_field(changeset, :profile_img_url) |> is_nil ) do
put_change(changeset, :profile_img_url, get_gravatar_image)
else
changeset
end
end