2017-06-15 1 views
0

J'ai un formulaire de contact simple envoi email et message champs. J'utilise Mailgun.envoyer un e-mail à partir de formulaire - protocole String.Chars non mis en œuvre

je peux envoyer un e-mail parfaitement de la console, mais quand j'essayer d'envoyer de la forme dans l'interface utilisateur, je reçois l'erreur suivante:

protocol String.Chars not implemented for %Iotc.Contact.Email{__meta__: 
#Ecto.Schema.Metadata<:loaded, "contact_emails">, email: 
"[email protected]", id: 25, inserted_at: ~N[2017-06-15 10:34:26.229957], 
message: "I'd like a cake please.", updated_at: ~N[2017-06-15 10:34:26.229977]} 

email_controller.ex

def create(conn, %{"email" => email_params, 
        "email" => %{"email" => email, 
        "message" => message}}) do 

    changeset = Contact.Email.changeset(%Iotc.Contact.Email{}, email_params) 
    case Contact.create_email(email_params) do 
     {:ok, email} -> 
     Iotc.Mailer.send_email(email, message) #<this is the issue. 
     conn 
     |> put_flash(:info, "Email sent") 
     |> redirect(to: email_path(conn, :index)) 
     {:error, changeset} -> 
     conn 
     |> put_flash(:error, "Something went wrong") 
     |> render("index.html", changeset: changeset) 
    end 

Je l'ai essayé de changer

Iotc.Mailer.send_email(email, message)

à

Iotc.Mailer.send_email(email_params)

Mais je puis me

key :to not found in: %{"email" => "[email protected]", "message" => "I'd like a cake please.", "name" => "Simon"}

+1

Essayez 'Iotc.Mailer.send_email (email.email, message) '. – Dogbert

+0

Merci encore @Dogbert qui semble avoir fonctionné. Qu'est-ce que nous faisons avec '(email.email, message)'? –

Répondre

1

Le motif {:ok, email} ombre la valeur de chaîne email extérieure avec une struct %Iotc.Contact.Email{} en send_email attend le premier argument pour être juste l'adresse e-mail valeur de chaîne. Vous pouvez obtenir la valeur d'adresse en faisant email.email:

case Contact.create_email(email_params) do 
    {:ok, email} -> 
    Iotc.Mailer.send_email(email.email, message) 
    ... 
    ... 
end 

ou vous pouvez modifier le motif d'ignorer la structure retournée puisque vous ne l'utilisez pas de toute façon:

case Contact.create_email(email_params) do 
    {:ok, _} -> 
    Iotc.Mailer.send_email(email, message) 
    ... 
    ... 
end