私は画像をアップロードしてニュース記事に関連付けるために、私が取り組んでいるPhoenixアプリケーションのフォームにPlug.Upload
構造体を利用しています。何らかの理由で、画像をアップロードしてフォームを送信すると、フラッシュ通知とリダイレクト/レンダリングが機能しません。以前のフォームが正常に送信され、データがdbに保存されていても、アプリは代わりに空の新しいフォームに戻ります。私は手動でインデックスページに戻り、記事が作成されたことを確認することができます。画像をアップロードしないと、フォームの提出時にすべてが正常に機能します。Phoenix - Plug.Uploadでのルーティングの問題
関連するフォームコード:
<%= form_for @changeset, @action, [multipart: true], fn f -> %>
...
<div class="form-group">
<label class="control-label">Upload Photo</label>
<%= file_input f, :photo, class: "form-control" %>
<%= error_tag f, :photo %>
</div>
関連する制御コード:
def create(conn, %{"article" => article_params}) do
image = if article_params["photo"], do: article_params["photo"], else: nil
changeset = if image do
File.cp!(image.path, "./web/static/assets/images/articles/" <> image.filename)
Article.changeset(%Article{}, article_params)
|> Ecto.Changeset.change(img_url: "/images/articles/" <> image.filename)
else
Article.changeset(%Article{}, article_params)
end
case Repo.insert(changeset) do
{:ok, article} ->
conn
|> put_flash(:info, "Article created successfully.")
|> redirect(to: article_path(conn, :show, article))
{:error, changeset} ->
if image do
File.rm("./web/static/assets/images/articles/" <> image.filename)
File.rm("./priv/static/images/articles/" <> image.filename)
end
render(conn, "new.html", changeset: changeset)
end
end
任意の洞察力を大幅に理解されるであろう。追加のコードを追加するには、さらに詳しい情報が必要な場合は、私にお知らせください。ありがとう!
そして、エラーがコンソールに出力されていませんか? 'Repo.insert'が' {ok、_} 'になるのは確かですか?いくつかのprint文を追加して、どの行のコード( 'if'や' case'のどの枝)が実際に実行されたかをトレースできますか? – Dogbert
Repo.insert(チェンジセット)に 'IO.inspect'を行い、' {ok、_} 'を得ました。 Plug.Uploadプロセスが終了またはリセットされると、ケースステートメントをバイパスします。 – jsonkenl
'|> IO.inspect'を' redirect'呼び出しの後に追加するとどうなりますか? ( 'IO.inspect'は渡された引数を返すので、コードは同じ値を出力します。 – Dogbert