2010-04-15 4 views
0

Je suis actuellement en train d'écrire une application Rails, et j'ai rencontré une étrange bizarrerie. J'ai un contrôleur PermissionsController, qui est principalement à des fins d'affichage pour le moment. Donc, mon routage est verrouillé:Rails RESTful routs sans #new, problème rspec

map.resources :permissions, :only => [:index, :show] 

Malheureusement, lors de l'écriture des tests, l'un des tests de routage échoue:

it "does not recognize #new" do 
    { :get => "/permissions/new" }.should_not be_routable 
end 

avec l'erreur:

Expected 'GET /permissions/new' to fail, but it routed to 
{"action"=>"show", "id"=>"new", "controller"=>"permissions"} instead 

De toute évidence, le # La route de l'action show correspond à /permissions/:id, ce qui donne également l'erreur attendue Couldn't find Permission with ID=new si vous naviguez jusqu'à cette URL.

Ce n'est pas une erreur sérieuse, car il déclenche correctement une exception avec le paramètre bad: id, mais c'est plutôt moche. Est-il possible de faire en sorte que Rails rejette cette route? Un truc dans les options de routage qui me manque? Je suppose que je devrais juste laisser ce test dehors et l'ignorer, ou peut-être enlever toute l'idée de RESTful tout à fait et revenir à un style plus simple map.connect 'permissions/:id'. Je suspecte fortement que je vais étendre cela à l'avenir, et que je voulais garder mes contrôleurs cohérents les uns avec les autres. Juste avoir à ajouter occasionnel: seulement ou: sauf les règles rendues routes.rb gentil et propre ...

Répondre

1

Eh bien c'est mappage correctement comme vous le faites remarquer. Si vous voulez vous assurer que :id est toujours un nombre, vous n'auriez pas ce problème.

Cela peut être fait avec une exigence sur l'itinéraire.

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