2009-04-12 6 views
4

Récemment, j'ai changé quelques ressources imbriquées dans l'une de mes applications pour utiliser un routage peu profond. Cela fonctionne très bien et j'ai pu simplifier mon point de vue et mes contrôleurs.Itinéraires peu profonds avec path_prefix?

Cependant, je me sers d'un path_prefix avant:

map.with_options :path_prefix => "blog" do |blog| 
    blog.resources :posts do |posts| 
    posts.resources :comments 
    end 
end 

avis que tous les itinéraires sont préfixées avec "/ blog" comme prévu.

# $ rake routes 
#    posts GET /blog/posts(.:format)       {:controller=>"posts", :action=>"index"} 
#     POST /blog/posts(.:format)       {:controller=>"posts", :action=>"create"} 
#   new_post GET /blog/posts/new(.:format)      {:controller=>"posts", :action=>"new"} 
#   edit_post GET /blog/posts/:id/edit(.:format)     {:controller=>"posts", :action=>"edit"} 
#    post GET /blog/posts/:id(.:format)      {:controller=>"posts", :action=>"show"} 
#     PUT /blog/posts/:id(.:format)      {:controller=>"posts", :action=>"update"} 
#     DELETE /blog/posts/:id(.:format)      {:controller=>"posts", :action=>"destroy"} 
#  post_comments GET /blog/posts/:post_id/comments(.:format)   {:controller=>"comments", :action=>"index"} 
#     POST /blog/posts/:post_id/comments(.:format)   {:controller=>"comments", :action=>"create"} 
# new_post_comment GET /blog/posts/:post_id/comments/new(.:format)  {:controller=>"comments", :action=>"new"} 
# edit_post_comment GET /blog/posts/:post_id/comments/:id/edit(.:format) {:controller=>"comments", :action=>"edit"} 
#  post_comment GET /blog/posts/:post_id/comments/:id(.:format)  {:controller=>"comments", :action=>"show"} 
#     PUT /blog/posts/:post_id/comments/:id(.:format)  {:controller=>"comments", :action=>"update"} 
#     DELETE /blog/posts/:post_id/comments/:id(.:format)  {:controller=>"comments", :action=>"destroy"} 

La nouvelle configuration de routage ressemble à ceci:

map.with_options :path_prefix => "blog", :shallow => true do |blog| 
    blog.resources :posts do |posts| 
    posts.resources :comments 
    end 
end 

Maintenant, le préfixe "/ blog" manque dans certains de mes routes. Je cherche une solution pour récupérer les préfixes pour toutes les routes. Je sais que cela fonctionne avec les espaces de noms (map.namespace :blog do), mais je veux empêcher la refactorisation de tous mes contrôleurs/vues/tests pour utiliser réellement les espaces de noms.

Tous les échantillons de code sont testés avec Rails version 2.3.2 et Ruby 1.8.7.

+0

Salut Cristoph, si Ma réponse ne suffisait pas Je pourrais peut-être vous aider davantage, mais pourriez-vous clarifier le résultat final que vous recherchez et les critères que vous avez pour une solution idéale? Quel était le problème de test original que vous essayez de résoudre en effectuant ce changement? –

+0

En fait, c'est assez simple: j'essaie de créer des routes peu profondes avec un préfixe de chemin * statique * tel que "/ blog" dans mon exemple. –

+0

Est-ce que la réponse de Raimonds est de faire ce dont vous avez besoin? Ou sinon, quels sont les itinéraires spécifiques que vous recherchez? –

Répondre

6

la documentation semble indiquer ce comportement exact est par la conception:

: peu profonde - Si cela est vrai, les chemins pour les ressources imbriquées qui font référence à un membre spécifique (par exemple ceux qui ont un paramètre: id.) Ne pas utiliser le préfixe du chemin parent ou le préfixe du nom.

(de http://api.rubyonrails.org/classes/ActionController/Resources.html#M000501)

Depuis en utilisant l'option: faible profondeur provoquera votre: path_prefix pour être ignoré dans certains cas, si vous devez toujours avoir ce préfixe vous devriez envisager de supprimer l'option: peu profonde. Voici une solution de rechange qui semble faire ce que vous avez besoin:

map.with_options :path_prefix => "blog" do |blog| 
    blog.resources :posts do |posts| 
    posts.resources :comments, :only => [:index, :create, :new] 
    end 
    blog.resources :comments, :except => [:index, :create, :new] 
end 

résultant de ces itinéraires:

#    posts GET /blog/posts        {:controller=>"posts", :action=>"index"} 
#     POST /blog/posts        {:controller=>"posts", :action=>"create"} 
#   new_post GET /blog/posts/new       {:controller=>"posts", :action=>"new"} 
#   edit_post GET /blog/posts/:id/edit      {:controller=>"posts", :action=>"edit"} 
#    post GET /blog/posts/:id       {:controller=>"posts", :action=>"show"} 
#     PUT /blog/posts/:id       {:controller=>"posts", :action=>"update"} 
#     DELETE /blog/posts/:id       {:controller=>"posts", :action=>"destroy"} 
#  post_comments GET /blog/posts/:post_id/comments    {:controller=>"comments", :action=>"index"} 
#     POST /blog/posts/:post_id/comments    {:controller=>"comments", :action=>"create"} 
# new_post_comment GET /blog/posts/:post_id/comments/new   {:controller=>"comments", :action=>"new"} 
#  edit_comment GET /blog/comments/:id/edit     {:controller=>"comments", :action=>"edit"} 
#   comment GET /blog/comments/:id      {:controller=>"comments", :action=>"show"} 
#     PUT /blog/comments/:id      {:controller=>"comments", :action=>"update"} 
#     DELETE /blog/comments/:id      {:controller=>"comments", :action=>"destroy"} 

Hope this helps!

+2

Il m'a semblé un peu étrange que vous ayez copié et collé la solution que j'avais proposée pour votre réponse. Je suppose que tu voulais tant ces 100 points bonus qui ont essayé de tout faire pour les gagner :) –

+0

Raimonds J'ai vu Christoph mentionner que ta réponse était utile. J'ai trouvé que c'était très proche de l'idéal, mais j'ai pu l'améliorer légèrement en le rendant plus concis, dans le but de fournir une réponse utile. Je m'excuse si une infraction a été commise; ce n'était pas prévu. Merci pour l'aide. –

+0

OK, tout va bien :) Je suis également d'accord que le déplacement de la dernière ligne à l'intérieur du bloc map.with_options était bon en termes de lisibilité. –

5

probablement la solution la plus simple ne serait pas à utiliser: l'option peu profonde, mais créer les mêmes routes avec définition des ressources supplémentaires:

map.with_options :path_prefix => "blog" do |blog| 
    blog.resources :posts do |posts| 
    posts.resources :comments, :only => [:index, :create, :new] 
    end 
end 
map.resources :comments, :path_prefix => "blog", 
       :except => [:index, :create, :new] 

qui donne les définitions des itinéraires suivants:

# $ rake routes 
#   posts GET /blog/posts(.:format)      {:action=>"index", :controller=>"posts"} 
#     POST /blog/posts(.:format)      {:action=>"create", :controller=>"posts"} 
#   new_post GET /blog/posts/new(.:format)     {:action=>"new", :controller=>"posts"} 
#  edit_post GET /blog/posts/:id/edit(.:format)    {:action=>"edit", :controller=>"posts"} 
#    post GET /blog/posts/:id(.:format)     {:action=>"show", :controller=>"posts"} 
#     PUT /blog/posts/:id(.:format)     {:action=>"update", :controller=>"posts"} 
#     DELETE /blog/posts/:id(.:format)     {:action=>"destroy", :controller=>"posts"} 
# post_comments GET /blog/posts/:post_id/comments(.:format)  {:action=>"index", :controller=>"comments"} 
#     POST /blog/posts/:post_id/comments(.:format)  {:action=>"create", :controller=>"comments"} 
# new_post_comment GET /blog/posts/:post_id/comments/new(.:format) {:action=>"new", :controller=>"comments"} 
#  edit_comment GET /blog/comments/:id/edit(.:format)   {:action=>"edit", :controller=>"comments"} 
#   comment GET /blog/comments/:id(.:format)    {:action=>"show", :controller=>"comments"} 
#     PUT /blog/comments/:id(.:format)    {:action=>"update", :controller=>"comments"} 
#     DELETE /blog/comments/:id(.:format)    {:action=>"destroy", :controller=>"comments"} 
Questions connexes