2017-06-15 5 views
2

私は以下のチェンジセットを使用して連絡先フォームを持っています。Phoenix 1.3でフォームを送信しようとすると、予想されるparamsがマップエラーになる可能性があります。

def changeset(%Email{} = email, attrs) do 

    email 
    |> cast(attrs, [:name, :email, :message, :event]) 
    |> validate_required([:name, :email, :message]) 
    end 

しかし、私はフォームを送信しようとすると、私は次のエラーを取得する:

expected params to be a map, got: `#Ecto.Changeset<action: nil, changes: % 
{email: "[email protected]", event: "wedding", message: "hello", name: "Simon"}, 
errors: [], data: #Iotc.Contact.Email<>, valid?: true>` 

は、関数を作成し、私の次のとおりです。

def create(conn, %{"email" => email_params}) do 
    changeset = Contact.Email.changeset(%Iotc.Contact.Email{}, email_params) 
    case Contact.create_email(changeset) do 
     {:ok, email} -> 
     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 
    end 

私はそれがattrsを拾っていないと仮定しています?

そしてcontact.exから:

def create_email(attrs \\ %{}) do 
    %Email{} 
    |> Email.changeset(attrs) 
    |> Repo.insert() 
    end 
+1

できますが、 'Contact.create_email'の定義を投稿しますか?チェンジセットを受け入れるのか、それともattrsだけを受け入れるのですか?私はあなたが 'Contact.create_email(email_params)'をしたいと思う。 – Dogbert

+0

@DogbertがOP –

答えて

1

Contact.create_email/1 attrsにマップ(ないチェンジセットを)期待して、あなたがそれにemail_paramsを渡す必要があるので、Contact.Email.changeset/2自身を呼び出します。

def create(conn, %{"email" => email_params}) do 
    case Contact.create_email(email_params) do 
    ... 
    end 
end 
+0

に追加されました。それが修正され、dbに新しいレコードが表示されます。ありがとう@dogbert –

関連する問題