2016-07-20 8 views
1

Ich benutze die Plug.Upload Struktur in einem Formular für eine Phoenix-App, die ich arbeite, um Bilder hochgeladen werden und mit einem Nachrichtenartikel verbunden werden. Aus irgendeinem Grund, wenn ich ein Bild hochlade und das Formular absende, funktioniert Flash Notice und redirect/render nicht. Die App kehrt stattdessen zu einem leeren neuen Formular zurück, obwohl das vorherige Formular erfolgreich übermittelt wurde und die Daten in der Datenbank beibehalten wurden. Ich kann manuell zur Indexseite zurückkehren und feststellen, dass der Artikel erstellt wurde. Wenn ich kein Bild hochlade, funktioniert alles wie erwartet bei der Einreichung des Formulars.Phoenix - Routing Probleme mit Plug.Upload

Relevante Formularcode:

<%= 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> 

Relevante Controller-Code:

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 

Einsicht würde sehr geschätzt werden. Wenn Sie weitere Informationen oder zusätzlichen Code benötigen, lassen Sie es mich wissen. Vielen Dank!

+0

Und keine Fehler gedruckt sind, auf die Konsole laden sollte? Sind Sie sicher, dass 'Repo.insert' zu' {: ok, _} 'führt? Können Sie einige Druckanweisungen hinzufügen und versuchen, zu verfolgen, welche Codezeilen (z. B. welche Zweige von "if" und "case") tatsächlich ausgeführt wurden? – Dogbert

+0

Ich habe 'IO.inspect' auf' Repo.insert (changeset) 'gesetzt und' '{: ok, _}' bekommen. Wenn der Plug.Upload-Prozess beendet oder zurückgesetzt wird, werden die Case-Anweisungen umgangen. – jsonkenl

+0

Was passiert, wenn Sie '|> IO.inspect' nach dem 'redirect'-Aufruf hinzufügen? ('IO.inspect' gibt das übergebene Argument zurück, so dass der Code identisch funktionieren sollte, außer dass auch der Wert ausgegeben wird.) – Dogbert

Antwort

1

Gefunden die Lösung, das Problem ist mit Live-Reload, das ist nur mit Google Chrome passiert, aber Sie können Ihre Live-Reload ändern, um nicht zu sehen, in welches Verzeichnis Sie Ihre Bilder hochladen, sollten Sie Ihre config/dev.exs live_reload ändern.

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)$} 
    ] 
] 

Und natürlich, wenn Sie priv/static Ordner hochladen Sie nicht zu css, js oder Bilder Ordner