【问题标题】:Ecto.Changeset if profile_img_url is not set use gravatarEcto.Changeset 如果 profile_img_url 没有设置使用 gravatar
【发布时间】:2016-06-26 18:21:45
【问题描述】:

当一个新用户注册时,我想默认给他一个 gravatar 头像,之后他应该可以手动设置,所以 changeset 方法应该只适用于 profile_img_url 为 nil

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 方法来检查值是否为 nil。 (不仅在变更集中,也在数据库中)

【问题讨论】:

  • 你是说当新用户注册时,如果他没有提供头像应用gravatar?
  • 您是否考虑过在视图中为此创建一个函数?该函数将检查头像是否存在,如果存在,则渲染头像图像,如果不存在,则渲染头像。
  • @coderVishal 是的,当没有提供 img 时,生成一个 gravatar
  • @JustMichael,如果我可以将图像应用到模型一次,我就不需要再检查了.. 有意义吗?

标签: elixir phoenix-framework ecto


【解决方案1】:

根据我目前的理解,您的实现是最新的,您可以使用另一种代码样式

  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

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多