2010-01-13 4 views
2

Je tente de créer une route personnalisée dans les rails et je ne suis pas sûre si je vais dans le bon sens. Tout d'abord j'ai une ressource RESTful pour les cachettes qui redirige vers mystash comme le contrôleur:Création d'une route Rails personnalisée

map.resources :stashes, :as => 'mystash' 
site.com/mystash goes to :controller => 'stashes', :action => 'show' 

Ce qui est ce que je veux. C'est là que ça devient un peu confus. Je voudrais pouvoir ajouter des paramètres conditionnels à cette route. En fin de compte, je voudrais avoir une route qui ressemble à ceci:

site.com/mystash/zoomout/new/quiz_on/

Je place ce dans les routes:

map.connect 'mystash/:zoom/:nav_option/:quiz', 
      :controller => 'stashes', 
      :action => 'show'  
map.connect 'mystash/:zoom/:nav_option', 
      :controller => 'stashes', 
      :action => 'show' 
map.connect 'mystash/:zoom', 
      :controller => 'stashes', 
      :action => 'show' 
map.connect 'mystash', 
      :controller => 'stashes', 
      :action => 'show' 

Mes itinéraires ont a fini par ressembler à ceci dans le navigateur: site.com//mystash/zoomin?nav_option=New & quiz = Quizon

et c'est ce qu'un de mes liens ressemble:

<%= link_to "In", stash_path("zoomin", :nav_option => @nav_option, :quiz => @quiz) %> 

Toute aide est appréciée, je suis assez nouveau sur les routes personnalisées!

Répondre

1

Vous devriez donner à ces routes des noms différents au lieu du nom par défaut, ou vous devriez spécifier votre route avec un hachage et non un appel X_path. Par exemple:

map.stash_zoom_nav_quiz 'mystash/:zoom/:nav_option/:quiz', 
    :controller => 'stashes', 
    :action => 'show'  
map.stash_zoom_nav 'mystash/:zoom/:nav_option', 
    :controller => 'stashes', 
    :action => 'show' 

Gardez à l'esprit que lorsque vous déclarez une route nommée, les paramètres du chemin doit être spécifié dans l'appel X_path sans omission, et non comme un hachage.

link_to('Foo', stash_zoom_nav_quiz_path(@zoom, @nav_option, @quiz)) 
link_to('Bar', stash_zoom_nav_path(@zoom, @nav_option)) 

L'alternative est de ne pas se soucier de routes nommées et laisser la figure de moteur de routage hors de son propre:

link_to('Foo', :controller => 'stashes', :action => 'show', :zoom => @zoom, :nav_option => @nav_option, :quiz => @quiz) 

Si vous êtes incertain ce que les routes sont définies, ou comment les appeler , inspectez toujours la sortie des "routes de rake" très attentivement. Vous pouvez également écrire des tests fonctionnels pour les routes avec la méthode assert_routing.