2016-04-16 73 views
0

我有一個鳳凰的動作,看起來像:保存路線上的錯誤在鳳凰城創建操作

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 
+0

您可以使用'ajax'來提交表單。 – JustMichael

回答

1

不幸的是,鳳凰城沒有這樣的事情。爲了簡單起見,流程始終是一個方向。當您在瀏覽器中輸入網址時,conn會被創建並被多次修改,但無法修改任何先前的步驟。

重定向只是強制瀏覽器請求新的url,但它不能攜帶任何參數。這不是鳳凰的事情,而只是一般的HTTP規則。

如果你真的需要的網址有/new末,你可以要做兩名黑客之一:

  • 少醜:在new.html.eex地方一些JavaScript代碼在頁面加載的URL強制性地設定爲users/new
  • 更醜陋:打破api並強制創建動作,使用POST /users/new而不是POST /users。我真的不推薦那個,但我只是爲了完整性而提及它。