我的凤凰行动看起来像:
def create(conn, %{"user" => user_params}) do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
{:ok, user} ->
conn
|> put_flash(:info, "#{user.name} created!")
|> redirect(to: user_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
关于验证错误,它会使用验证错误呈现相应的表单,但它不会保留相应的路径,例如,/users/new
代替/users
显示POST
,因为它正在尝试create
对资源。似乎因为它应该保留新路线,但我知道我们现在处于new
行动中。有没有办法'重定向'并仍然保留变更集?我希望我可能需要更改 def new(conn, _params) do
changeset = User.changeset(%User{})
render conn, "new.html", changeset: changeset
end
操作签名中的变更集以将状态传递给该操作,但不确定这是否有其他后果我可能会后悔。我的新动作:
out
答案 0 :(得分:1)
不幸的是凤凰城没有这样的东西。为了简单起见,流程始终是一个方向。当您在浏览器中输入网址时,会conn
创建并多次修改,但它无法修改之前的任何步骤。
重定向只是强制浏览器请求新网址,但它无法携带任何参数。它不是Phoenix的东西,而只是一般的HTTP规则。
如果你真的需要网址最后有/new
,你可以尝试两种黑客之一:
new.html.eex
中,一些javascript在页面加载时强行将网址设置为users/new
。POST /users/new
而不是POST /users
。我真的不推荐那个,但我只是为了完整而提到它。