2016-05-04 11 views
1

Userhas_manyemails und Email hat ein Attribut md5sum. Für einen bestimmten Benutzer @user möchte ich das Gravatar Bild in user#show anzeigen.Wie bekomme ich ein Attribut vom ersten einer has_many-Assoziation?

Der folgende Code in der Vorlage nicht funktioniert:

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

Wie kann ich die md5sum der ersten email für @user in der Vorlage erhalten?

web/Controller/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 
[...] 

Web/Modelle/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 
[...] 

Web/Modelle/email.ex

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

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

Antwort

2

Die emails wird eine Liste von E-Mails sein, wenn sie verfügbar sind. Der Grund <img src="http://www.gravatar.com/avatar/<%= @user.emails.first.md5sum %>" /> funktioniert nicht, weil . verwendet wird, um auf eine Eigenschaft auf einer Karte zuzugreifen. emails ist eine Liste.

können Sie hd/1 verwenden Sie das erste Element der Liste zu erhalten:

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

Dies wird einen Fehler, wenn der Benutzer, obwohl im Zusammenhang keine E-Mails hat.

Sie können eine Funktion Ihrer Ansicht nach besser dran definieren (oder in einem anderen Modul, das Sie in Ihrer Ansicht importieren):

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

Sie können diese dann in der Vorlage verwenden:

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