没有#new,rspec麻烦的Rails RESTful路由

时间:2010-04-15 06:05:56

标签: ruby-on-rails routing

我正在编写一个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变得干净整洁......

1 个答案:

答案 0 :(得分:1)

正如你指出的那样正确映射。如果您想确保:id始终是一个数字,那么您就不会遇到此问题。

这可以通过路线上的要求来完成。

map.connect ':controller/:action/:id', :requirements => { :id => /\d?/ }
map.connect ':controller/:action/:id.:format', :requirements => { :id => /\d?/ }