2016-07-20 1 views
1

私は画像をアップロードしてニュース記事に関連付けるために、私が取り組んでいる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 

任意の洞察力を大幅に理解されるであろう。追加のコードを追加するには、さらに詳しい情報が必要な場合は、私にお知らせください。ありがとう!

+0

そして、エラーがコンソールに出力されていませんか? 'Repo.insert'が' {ok、_} 'になるのは確かですか?いくつかのprint文を追加して、どの行のコード( 'if'や' case'のどの枝)が実際に実行されたかをトレースできますか? – Dogbert

+0

Repo.insert(チェンジセット)に 'IO.inspect'を行い、' {ok、_} 'を得ました。 Plug.Uploadプロセスが終了またはリセットされると、ケースステートメントをバイパスします。 – jsonkenl

+0

'|> IO.inspect'を' redirect'呼び出しの後に追加するとどうなりますか? ( 'IO.inspect'は渡された引数を返すので、コードは同じ値を出力します。 – Dogbert

答えて

1

解決方法が見つかりました。問題はライブリロードで発生します。これはGoogle Chromeでのみ発生しましたが、画像をアップロードするディレクトリを監視しないようにライブリロードを変更できます。config/dev.exs live_reloadを変更する必要があります。

config :app, App.Endpoint, 
live_reload: [ 
    patterns: [ 
    ~r{priv/static/js/.*js$}, 
    ~r{priv/static/css/.*css$}, 
    ~r{priv/static/css/images/.*(png|jpeg|jpg|gif|svg)$}, 
    ~r{priv/gettext/.*(po)$}, 
    ~r{web/views/.*(ex)$}, 
    ~r{web/templates/.*(eex)$} 
    ] 
] 

そしてもちろん、あなたがpriv/staticフォルダにアップロードされている場合は、CSSにアップロードべきではない、JSまたは画像フォルダ