2017-05-25 52 views
0

我想確定處理表單提交和路由的最佳方式。Rails 5路由和表單提交

我有標準_form.html.erb,以及new.html.erbedit.html.erb - 每個渲染formsubscription = @subscription,其在newedit控制器宣告行動。

型號爲subscription,這是我form元素_form.html.erb(它在checkout命名空間) -

<%= form_for([:checkout, subscription]) do |f| %> 

/checkout/subscriptions/new是一個新的訂閱的URL。當您提交表格時,它將張貼到/subscriptions

問題是,如果有錯誤,並且刷新瀏覽器(我知道用戶會因爲某種原因這樣做),您會收到一條錯誤消息,因爲沒有/subscriptions/index的視圖(我不需要一)。

同樣適用於編輯。如果你去(作爲例子)/checkout/subscriptions/14/edit,一切都很好。但是,如果您提交表單,則會發布到/subscriptions - 與新版本相同的問題 - 如果刷新頁面,您會收到沒有視圖錯誤。這是Rails用一個新的腳手架處理它的方式。

所以我的問題是:

  • 有什麼網址我應該在form_for標籤使用?
  • 我應該怎麼做路由?
  • 以及如何在刷新頁面時避免此錯誤?

回答

3

這就是REST的rails版本的工作原理。這裏的關鍵是HTTP方法。

重新加載頁面會創建一個GET請求。雖然您的控制器應該使用POST創建資源,並使用PATCH/PUT更新。

GET requests should be idempotent(不創建,修改或刪除資源),因此/subscriptions/subscriptions/:id的GET請求是非常不同的。

你可以做的:

  • 使用window.beforeunload事件在JavaScript中警告說,他們將失去數據的用戶。
  • GET /subscriptions路徑路由到subscriptions#new
  • GET /subscriptions/:id路徑路由至subscriptions#edit
+0

這樣做@max - 謝謝。我從來沒有想過爲同一個控制器操作有多條路線。 – Steve

+0

這是一個很好的解釋。讚賞你。乾杯! – Aashish