我正在尝试确定处理表单提交和路由的最佳方法。
我有标准_form.html.erb ,以及 new.html.erb 和 edit.html.erb - 每个呈现form
,subscription = @subscription
,在new
和edit
控制器操作中声明。
模型为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
代码中使用的网址是什么?答案 0 :(得分:3)
这是rails的rails版本的工作原理(并且应该可以工作)。这里的关键是HTTP方法。
重新加载页面会创建GET
请求。您的控制器应使用POST
创建资源,并使用PATCH/PUT
进行更新。
GET requests should be idempotent(不创建,更改或删除资源)因此/subscriptions
或/subscriptions/:id
的GET请求非常不同。
你能做什么:
window.beforeunload
事件警告用户他们将丢失数据。GET /subscriptions
路径路由至subscriptions#new
。GET /subscriptions/:id
路径路由至subscriptions#edit
。