我读了ruby指南的这一部分:http://guides.rubyonrails.org/routing.html
表明把东西塞进CRUD并不总是理想的。我有一个案例,我想有一个最终的"提交"按钮后的调查,通过并重新验证所有的数据确实已经填写(因为你可以在部分调查工作,它将保存和验证到数据库),但最终提交的一切都必须填写。所以我的submit link_to我想在控制器中调用一个方法:
in my view:
<%= link_to "Submit", :action => 'final_verify', :document_id => @document.id %>
现在我使用wicked作为向导控制器,所以我必须创建一个路由来匹配,所以这个调用将工作:
routes.rb:
#match route so I can call from page_controller.rb
match ':controller/:action/:id'
所以这是有效的,它运行等,但问题是,如果有一个错误在final_verify我想重定向到一个特定的页面,我创建一个路由吗?还是我必须欺骗redirect_to来正确完成?我似乎想不出最好/正确的方法来做这件事。
我不相信我匹配的路由甚至是正确的方式,只是为了让link_to调用最终验证并进入违规页面(如果有的话),以便用户可以完成所需的部分并再次尝试提交。(部分绊倒我是如何做到这一点,使用邪恶的宝石https://github.com/schneems/wicked
您创建的路由实际上是一个遗留的,"野控制器"路由(只有动作和id是不可选的),它将匹配任何控制器,动作和id。如果你正在做一个RESTful应用程序,不建议这样做。
如果你为你的特定目的创建一个命名路由会更好:
match 'submit/:document_id' => 'your_controller#final_verify', :as => :final_verify
第一部分是可用的url,中间部分是应该被调用的控制器和动作,第三部分是路由名,它将在视图和控制器中给你final_verify_path
和final_verify_url
方法。所以你的link_to调用应该是这样的:
<%= link_to "Submit", final_verify_path(:document_id => @document.id) %>
在提交不完整的调查后显示错误,你基本上有两个选项:
- 呈现一个模板作为你的动作的结果
- 重定向到不同的操作
似乎你想做第二个,所以你需要redirect_to
在控制器中显示错误的动作,例如在正确的向导页面上。如果您让您的遗留路线保持原样,您可能不需要做任何其他事情。但是如果你选择使用命名路由,你只需要定义另一个路由,并在重定向中使用它。