2016-05-04 3 views
1

Userhas_manyemailsおよびEmailの属性はmd5sumです。与えられたユーザーのために@useruser#showGravatarイメージを表示したいと思います。has_many関連の最初の属性を取得する方法は?

テンプレートに次のコードは動作しません:

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

は、どのように私はテンプレートに@userための最初のemailmd5sumを得ることができますか?

ウェブ/コントローラ/ user_controller.ex

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

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

ウェブ/モデル/ user.ex

defmodule MyApp.User do 
    use MyApp.Web, :model 
    use Arc.Ecto.Model 

    schema "users" do 
    field :first_name, :string 
    field :last_name, :string 
    has_many :emails, MyApp.Email 
[...] 

ウェブ/モデル/ email.ex

defmodule MyApp.Email do 
    use MyApp.Web, :model 

    schema "emails" do 
    field :value, :string 
    field :md5sum, :string 
    belongs_to :user, MyApp.User 
[...] 

答えて

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) %>" /> 
関連する問題