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