如果未设置profile_img_url,则使用Ecto.Changeset使用gravatar

时间:2016-06-24 22:12:54

标签: elixir phoenix-framework ecto

当一个新用户注册时,我想默认给他一个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来检查值是否为零。 (不仅在变更集中,而且在数据库中)

2 个答案:

答案 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