Elixir Phoenix-Plug.Upload的路由问题

Elixir Phoenix-Plug.Upload的路由问题,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在为我正在开发的Phoenix应用程序使用Plug.Uploadstruct,允许上传图像并将其与新闻文章关联。由于某些原因,当我上传图像并提交表单时,flash通知和重定向/渲染不起作用。该应用程序将恢复为一个空白的新表单,即使以前的表单已成功提交,并且数据保留到数据库中。我可以手动返回索引页面,查看文章是否已创建。当我不上传图像时,在提交表单时,一切都会按预期进行 有关表格编号: <%= form_for @changeset, @action, [multipart: true]

我正在为我正在开发的Phoenix应用程序使用
Plug.Upload
struct,允许上传图像并将其与新闻文章关联。由于某些原因,当我上传图像并提交表单时,flash通知和重定向/渲染不起作用。该应用程序将恢复为一个空白的新表单,即使以前的表单已成功提交,并且数据保留到数据库中。我可以手动返回索引页面,查看文章是否已创建。当我不上传图像时,在提交表单时,一切都会按预期进行

有关表格编号:

<%= form_for @changeset, @action, [multipart: true], fn f -> %>
%>


上传照片
相关控制器代码:

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
def create(conn,%%{“article”=>article_params})do
image=if article_params[“photo”],do:article_params[“photo”],else:nil
changeset=如果图像不可用
File.cp!(image.path,“./web/static/assets/images/articles/”image.filename)
Article.changeset(%Article{},Article_参数)
|>Changeset.change(img_url:“/images/articles/”image.filename)
其他的
Article.changeset(%Article{},Article_参数)
结束
案例回购插入(变更集)do
{:好的,文章}->
康涅狄格州
|>put_flash(:info,“文章创建成功”)
|>重定向(到:文章路径(连接,显示,文章))
{:错误,变更集}->
如果图像有
File.rm(“./web/static/assets/images/articles/”image.filename)
File.rm(“./priv/static/images/articles/”image.filename)
结束
呈现(conn,“new.html”,变更集:变更集)
结束
结束

如有任何见解,将不胜感激。如果您需要更多信息或我添加额外的代码,请让我知道。谢谢

找到了解决方案,问题在于实时重新加载,这只发生在google chrome上,但您可以更改实时重新加载以不查看上载图像的目录,您应该更改
config/dev.exs
live\u重新加载

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
文件夹,您不应该上传到cssjs图像文件夹

,并且控制台上没有打印错误?您确定
Repo.insert
会导致
{:ok,}
?你能添加一些打印语句并尝试跟踪哪些代码行(例如,如果和案例的哪些分支)实际执行了吗?我在Repo.insert(changeset)上做了一个IO。检查,得到了。就像一旦Plug.Upload进程终止或重置,它就会绕过case语句。如果在
重定向
调用后添加
|>IO.inspect
,该怎么办?(
IO.inspect
返回传递的参数,因此代码除了打印值外,应能正常工作。)返回
conn
:()
resp_headers
包含
{“location”,“/articles/22”}
。你在那里被重定向了吗?如果没有,您应该在ChromeDevTools->Network选项卡中对此进行调试,并查看提交表单后浏览器实际收到的标题。
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)$}
  ]
]