Rails 5路由和表单提交

时间:2017-05-25 22:38:42

标签: ruby-on-rails

我正在尝试确定处理表单提交和路由的最佳方法。

我有标准_form.html.erb ,以及 new.html.erb edit.html.erb - 每个呈现formsubscription = @subscription,在newedit控制器操作中声明。

模型为subscription,这是 _form.html.erb 中的form元素(它位于checkout命名空间中) -

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

/checkout/subscriptions/new是新订阅的网址。当您提交表单时,它会发布到/subscriptions

问题是,如果有错误,并刷新浏览器(我知道用户会出于某种原因这样做),您会收到一条错误消息,因为/subscriptions/index没有视图(我不知道)不需要一个)。

同样适用于编辑。如果你去(例如)/checkout/subscriptions/14/edit,一切都很棒。但是,如果您提交表单,它会发布到/subscriptions - 与新问题相同 - 如果您刷新页面,则会收到 no view 错误。这是Rails使用新脚手架处理它的方式。

所以我的问题是:

  • 我应该在form_for代码中使用的网址是什么?
  • 我应该怎样做路由?
  • 如何在刷新页面时避免此错误?

1 个答案:

答案 0 :(得分:3)

这是rails的rails版本的工作原理(并且应该可以工作)。这里的关键是HTTP方法。

重新加载页面会创建GET请求。您的控制器应使用POST创建资源,并使用PATCH/PUT进行更新。

GET requests should be idempotent(不创建,更改或删除资源)因此/subscriptions/subscriptions/:id的GET请求非常不同。

你能做什么:

  • 使用javascript中的window.beforeunload事件警告用户他们将丢失数据。
  • GET /subscriptions路径路由至subscriptions#new
  • GET /subscriptions/:id路径路由至subscriptions#edit