在 Phoenix 中没有重定向的 POST 操作中响应错误页面的正确方法是什么?

What's the correct way to respond to error page in a POST action without redirect in Phoenix?

我认为这是一个基本情况。我有一个 POST 操作,我想响应 403 状态并显示错误页面。

def signup(conn, params) do
  ...
  conn
  |> Plug.Conn.send_resp(:forbidden, "Forbidden")
  |> Plug.Conn.halt()
end

但是,它会 return 403 但不会呈现错误页面。相反,它会在浏览器中抛出 Failed to load resource: the server responded with a status of 403 () 并下载一个奇怪的 signup.dms 文件。

我设计了一个403.html.eex,有谁知道如何正确显示吗?

您需要先 render 您的模板,然后再 halt。它可能看起来像这样:

conn
|> put_status(:forbidden)
|> put_view(MyApp.ErrorView)
|> render("403.html")
|> halt()

在这种情况下,您需要创建 MyApp.ErrorView 并在 templates/error 中创建 403.html.eex

下载 *.dms 文件的原因是我没有为响应设置 Content-Type

def signup(conn, params) do
  ...
  conn
  |> Plug.Conn.update_resp_header("content-type", "text/plain", &(&1 <> "; charset=utf-8"))
  |> Plug.Conn.send_resp(:forbidden, "Forbidden")
  |> Plug.Conn.halt()
end