2010-03-05 4 views
3

Je cherche à faire une action de show d'un de mes contrôleurs à la racine. Je peux le faire facilement:Rails routes - Afficher l'action en tant que root

map.root :controller => 'articles', :action => 'index' 

Quand je vais à localhost: 3000/elle énumère tous les articles - c'est génial! Ce que je veux réaliser, cependant, est une URL comme celui-ci

localhost:3000/1 

Pour afficher un article avec l'ID 1. Modification de l'itinéraire le Seraient ce que je pense que je dois faire:

map.root :controller => 'articles', :action => 'show' 

Mais cela ne semble pas fonctionner. Au lieu de cela - il cherche un contrôleur appelé 1 - qui n'existe pas.

Comment ferais-je cela?

Merci!

Répondre

6

Essayez ceci dans routes.rb

map.connect ':id', :controller => 'articles', :action => 'show'

Vous voulez vous assurer que c'est un voie basse priorité en raison de la façon dont il est général. À savoir, le mettre vers le bas de votre fichier routes.rb, mais au-dessus de cette section (si vous ne l'avez pas supprimé déjà):

# low-priorty article show route 
map.connect ':id', :controller => 'articles', :action => 'show' 

# Install the default routes as the lowest priority. 
# Note: These default routes make all actions in every controller accessible via GET requests. You should 
# consider removing or commenting them out if you're using named routes and resources. 
map.connect ':controller/:action/:id' 
map.connect ':controller/:action/:id.:format' 
+0

merci. Vous avez été le premier à donner une réponse, donc vous obtenez le crédit. Merci pour l'explication supplémentaire dans votre édition. –

5

Une route racine définir une seule voie. Pas plusieurs. Vous pouvez définir un autre itinéraire

map.connect '/:id', :controller => 'articles', :action => 'show'

Si vous voulez que ce style de la route, peut-être une des ressources (http://api.rubyonrails.org/classes/ActionController/Resources.html#M000522) est idéal pour vous.

+0

fonctionne, mais maintenant aucun de mes autres contrôleurs n'est accessible. Un moyen de contourner cela? –

+0

et de répondre à ma propre question - assurez-vous que cette ligne de code est en dessous de tous les autres que vous voulez avoir la priorité. Dans routes.rb, plus la route est haute dans la liste, plus la priorité est élevée. –

+0

juste une note, shingara; vous n'avez pas besoin de '/' avant ': id' :) –

2

Utilisez cette

resource :articles, :path => '/' 

avec tout cela de votre article sera directement sous la racine

3

Dans Rails 3 il n'y a pas de méthode de carte disponible dans les routes. Au lieu de cela, utilisez quelque chose comme ceci:

match ':id', :controller => 'articles', :action => 'show' 

Et n'oubliez pas de le mettre ci-dessous les routes qui devraient avoir préséance.

Questions connexes