2016-06-24 13 views
2

Wenn sich ein neuer Benutzer anmeldet, möchte ich ihm standardmäßig ein Gravatar-Profilbild geben, danach sollte er es manuell setzen können, daher sollte die Changeset-Methode nur dann angewendet werden profile_img_url ist gleich NullEcto.Changeset Wenn profile_img_url nicht gesetzt ist benutze gravatar

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 

Also im Grunde die Frage ist, dann ist dies der richtige Weg, es zu tun, und gibt es einen Ecto Mehtod zu überprüfen, ob der Wert gleich Null ist oder nicht. (Nicht nur im Änderungssatz, sondern auch im db)

+0

sagen Sie, dass, wenn ein neuer Benutzer registriert, wenn er nicht zur Verfügung gestellt hat anwenden ein Profilbild ein Gravatar? – coderVishal

+0

Haben Sie darüber nachgedacht, eine Funktion in einer Ansicht zu erstellen? Die Funktion würde prüfen, ob ein Avatar vorhanden ist, und wenn dies der Fall ist, würde es das Avatarbild rendern, wenn nicht, würde es den Gravatar darstellen. – JustMichael

+0

@coderVishal ja genau, wenn keine img zur Verfügung gestellt, erzeugen ein Gravatar – webdeb

Antwort

2

Gemäß meinem aktuellen Verständnis der Implementierung aktuell ist, Sie eine alternative Art von Code verwenden könnten

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 
+0

ok, danke für ein alternatives Implementierungsbeispiel – webdeb

2

Eine Lösung gefunden, aber ich werde es nicht als akzeptiert markieren, damit andere Leute einen besseren Vorschlag machen können.

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