如何获取has_many关联的第一个属性?

时间:2016-05-04 07:28:26

标签: elixir phoenix-framework

User has_many emailsEmail有一个属性md5sum。对于给定用户@user,我想在user#show中显示Gravatar图片。

模板中的以下代码不起作用:

<img src="http://www.gravatar.com/avatar/<%= @user.emails.first.md5sum %>" />

如何在模板中获取md5sum的{​​{1}}的{​​{1}}?

网络/控制器/ user_controller.ex

email

网络/模型/ user.ex

@user

网络/模型/ email.ex

[...]
def show(conn, %{"id" => id}) do
  user = Repo.get!(User, id) |> Repo.preload([:emails])

  conn
  |> assign(:user, user)
  |> render("show.html")
end
[...]

1 个答案:

答案 0 :(得分:2)

如果有可用的话,emails将是电子邮件列表。

<img src="http://www.gravatar.com/avatar/<%= @user.emails.first.md5sum %>" />无效的原因是因为使用.来访问地图上的属性。 emails是一个列表。

您可以使用hd/1获取列表的第一个元素:

<img src="http://www.gravatar.com/avatar/<%= hd(@user.emails).md5sum %>"  />

如果用户没有关联的电子邮件,则会出错。

您可能最好在视图中定义一个函数(或者在视图中导入的另一个模块中):

def gravatar_url(user) do
  case user.emails do
    [email | _tail] -> "http://www.gravatar.com/avatar/#{email.md5sum}"
    _               -> "some-default-avatar"
  end
end

然后您可以在模板中使用它:

<img src="<%= gravatar_url(@user) %>"  />