2009-09-25 27 views
1

J'essaie de créer une ressource imbriquée avec un schéma d'URL suivant les instructions suivantes: "http://example.com/username/...".Ressource imbriquée au niveau racine du chemin d'accès

Ce que j'ai actuellement est la suivante:

ActionController::Routing::Routes.draw do |map| 
    map.home '/', :controller => 'home' 

    map.resource :session 

    map.resources :users, :has_many => :nodes 
    #map.user '/:id', :controller => 'users', :action => 'show', :has_many => :nodes 

    map.resources :nodes, :belongs_to => :user 
end 

Cela se traduit par des URL comme:

http://example.local/users/username 
http://example.local/users/username/nodes 

Comment éviter le préfixe "utilisateurs" est au-delà de moi. Le passage d'une option "as: => ''" à map.resources ne fonctionne pas et il semble que les routes nommées ne prennent pas en charge les options ":has_many" ou ":belongs_to". Donnez votre avis sur le "map.resources :users" et désactivez la ligne "map.user" après qu'il semble fonctionner ... jusqu'à ce que vous atteigniez une ressource imbriquée. Ensuite, il recrache l'erreur suivante: « Pourquoi voudriez-vous faire »

undefined method `user_nodes_path' for #<ActionView::Base:0x1052c8d18> 

Je sais que ce problème est venu beaucoup de fois avant et toujours rencontré réponses Franchement, Twitter le fait, Facebook le fait, et je veux le faire aussi! En ce qui concerne la critique commune sur la façon d'éviter les noms d'utilisateurs de chemins intégrés conflictuels, j'ai défini la longueur de mon nom d'utilisateur minimum à 6 caractères et prévois de faire tous les chemins de segments de chemins de niveau racine intégrés. caractères ou plus courts (par exemple "/opt/..." pour les options, "/in/..." pour la connexion à la session, etc.).

Répondre

1

Comme indiqué dans cette question:

Default segment name in rails resources routing

Vous devriez pouvoir utiliser ce plugin:

http://github.com/caring/default_routing

Sinon, vous pouvez les spécifier manuellement avec quelque chose comme

map.users  '/users',  :controller => 'users', :action => 'index', 
    :conditions => { :method => :get } 
map.connect '/users',  :controller => 'users', :action => 'create', 
    :conditions => { :method => :post } 
map.user  '/:id',  :controller => 'users', :action => 'show', 
    :conditions => { :method => :get } 
map.edit_user '/:id/edit', :controller => 'users', :action => 'edit', 
    :conditions => { :method => :get } 
map.new_user '/users/new', :controller => 'users', :action => 'new', 
    :conditions => { :method => :get } 
map.connect '/:id', :controller => 'users', :action => 'update', 
    :conditions => { :method => :put } 
map.connect '/:id', :controller => 'users', :action => 'destroy', 
    :conditions => { :method => :delete } 

map.resources :nodes, :path_prefix => '/:user_id', :name_prefix => 'user_' 
# to generate user_nodes_path and user_node_path(@node) routes 

Cela ou quelque chose comme ça devrait vous donner ce que vous voulez de map.resources.

map.resources doesn't work and it seems named routes don't support the ":has_many" or ":belongs_to" options.

routes nommées soutient has_many, qui est utilisé pour ajouter un autre niveau de ressources sur le chemin d'URL. Par exemple

map.resources :users, :has_many => :nodes 

génère tous les users_path et user_nodes_path routes comme /users, /users/:id, /users/:id/nodes et /users/:id/nodes/:id. Il est identique à

map.resources :users do |user| 
    user.resources :nodes 
end 

Commenting out the "map.resources :users" and uncommmenting the "map.user" line after it seems to work… until you reach a nested resource. Then it spits out the following error:

undefined method `user_nodes_path' for #<ActionView::Base:0x1052c8d18> 

C'est parce que map.resources :users, :has_many => :nodes génère ces itinéraires. Une seule route nommée est générée par map.user '/:id', :controller => 'users', :action => 'show' et c'est user_path.

+0

Brillant! Je suis assez surpris de ne pas avoir trouvé le plugin default_routing plus tôt; il ressemble à un must-have pour n'importe quel projet! Merci de votre aide! –

+3

Je dois mentionner que si le plugin default_routing est génial, il est aussi terriblement cassé dans Rails 2.3.4 (et peut-être aussi dans les versions antérieures). Cependant, il existe une version corrigée sur http://github.com/slippyd/default_routing. –

+0

Merci pour le lien, Slippy, votre version a parfaitement fonctionné pour moi! –

0

Voir ma réponse à this related question

Fondamentalement, vous pouvez passer :path => '' en option pour annuler le segment d'identification (testé dans Rails 3 seulement) juste être conscient que cela peut entrer en conflit avec d'autres modèles de routage, donc soyez prudent lorsque et comment vous le placez.

+0

Cela semble être le genre de problème (et de correction) que Rails 3.x a éliminé. Je vais devoir vérifier votre solution quand je mets à jour l'application dont j'ai besoin pour Rails 2.3.x à 3.x. –