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!
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
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
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