我正在编写一个Rails应用程序,并且有点奇怪的怪癖。我有一个控制器PermissionsController
,主要用于显示目的。所以我的路由被锁定了:
map.resources :permissions, :only => [:index, :show]
不幸的是,在编写测试时,其中一个路由测试失败了:
it "does not recognize #new" do
{ :get => "/permissions/new" }.should_not be_routable
end
错误:
Expected 'GET /permissions/new' to fail, but it routed to
{"action"=>"show", "id"=>"new", "controller"=>"permissions"} instead
显然,#show操作的路由与/permissions/:id
匹配,如果您实际浏览到该URL,也会提供预期的错误Couldn't find Permission with ID=new
。
这不是一个严重的错误,因为它正确地使用bad:id参数引发异常,但它有点难看。有没有办法让Rails拒绝这条路线?我缺少路由选项中的一些技巧?
我想我应该放弃测试并忽略它,或者完全删除整个RESTful想法并回到更简单的map.connect 'permissions/:id'
样式。我强烈怀疑我将来会扩展它,并且有点想让我的控制器保持一致。只需要偶尔添加:only或:除了规则使routes.rb变得干净整洁......
答案 0 :(得分:1)
正如你指出的那样正确映射。如果您想确保:id
始终是一个数字,那么您就不会遇到此问题。
这可以通过路线上的要求来完成。
map.connect ':controller/:action/:id', :requirements => { :id => /\d?/ }
map.connect ':controller/:action/:id.:format', :requirements => { :id => /\d?/ }