35 votes

Comment supprimer les noms de contrôleur des routes de rails?

Je tiens à rogner sur les routes, sur ma demande, de sorte que:

http://myapplication.com/users/peter/questions/how-do-i-create-urls

devient...

http://myapplication.com/peter/how-do-i-create-urls

J'ai un controller users et le voudriez être débrouillard. Les utilisateurs ont également un ensemble de ressources appelé questions.

Base fichier de routes

Sans aucune URL de parage, de la routes fichier ressemble à ceci:

...
resources :users do
  resources :questions
end

Cependant, l'Url de ce prendre la forme de

http://myapplication.com/users/peter/questions/how-do-i-create-urls

plutôt que de

http://myapplication.com/peter/how-do-i-create-urls

Réussite partielle J'ai essayé de faire le suivant:

...
resources :users, :path => '' do
  resources :questions
end

Cela fonctionne et produit:

http://myapplication.com/peter/questions/how-do-i-create-urls

Cependant si j'ai essayer:

...
resources :users, :path => '' do
  resources :questions, :path => ''
end

Puis les choses commencent à aller mal.

Est-ce la bonne approche et, dans l'affirmative, peut-il être fait pour travailler avec imbriqué ressources trop?

37voto

DanneManne Points 13408

La façon dont vous faites cela devrait fonctionner. Je ne sais pas quel est le problème que vous rencontrez, mais si vous avez copié l'exemple de code dans votre application directement, alors qu'il pourrait être en raison de la plus - end que vous avez mis dans vos itinéraires. Il doit probablement ressembler à ceci:

resource :users, :path => '' do
  resource :questions, :path => ''
end

Une autre chose qui pourrait être la cause et que vous avez besoin pour être varier attention que ces routes assez bien les captures de toutes les demandes et vous devriez avoir le dernier dans vos itinéraires.rb, de sorte que d'autres voies matchs en premier. Prenez ce scénario par exemple:

resource :users, :path => '' do
  resource :questions, :path => ''
end

resources :posts

Si vous le faites de cette façon, alors aucune demande ne pourra jamais être acheminés vers les Postes de contrôleur puisqu'une demande d' /articles/1 sera envoyé à l'Questions contrôleur :user_id => 'posts', :id => 1

Edit:

Aussi, j'ai maintenant remarqué que vous utilisez des ressources au lieu de ressources. Ne sais pas si c'est voulu ou si c'est une erreur.

6voto

Peter Nixey Points 4153

Merci à @mark et @DanneManne pour leur aide. Avec leur contribution et un peu plus de réglages, j'ai tout fait fonctionner. Ce n'est pas exactement trivial, mais je ne suis pas sûr que vous puissiez le raccourcir beaucoup plus:


Code de travail final

 # setup the basic resources while holding some back for creation below
resources :users, :except => [:show, :index, :new, :create], :path => '/' do
  resources :questions, :except => [:show]
end

# for clarity, pick out routes that would otherwise go 
# to root (such as new_user => '/new')
resources :users, :only => [:index, :new, :create]


# setup questions#show to give clean URLS
match ':user_id/:question_id', :as => :user_question, 
                               :via => :get,
                               :controller => :questions, 
                               :action => :show

# setup users#show method to give clean URLS
match ':user_id', :as => :user, 
                  :via => :get, 
                  :controller => :user, 
                  :action => :show
 

Sortie Rake Routes

     user_questions GET    /:user_id/questions(.:format)          {:action=>"index", :controller=>"questions"}
                   POST   /:user_id/questions(.:format)          {:action=>"create", :controller=>"questions"}
 new_user_question GET    /:user_id/questions/new(.:format)      {:action=>"new", :controller=>"questions"}
edit_user_question GET    /:user_id/questions/:id/edit(.:format) {:action=>"edit", :controller=>"questions"}
     user_question PUT    /:user_id/questions/:id(.:format)      {:action=>"update", :controller=>"questions"}
                   DELETE /:user_id/questions/:id(.:format)      {:action=>"destroy", :controller=>"questions"}
         edit_user GET    /:id/edit(.:format)                    {:action=>"edit", :controller=>"users"}
              user PUT    /:id(.:format)                         {:action=>"update", :controller=>"users"}
                   DELETE /:id(.:format)                         {:action=>"destroy", :controller=>"users"}
             users GET    /users(.:format)                       {:action=>"index", :controller=>"users"}
                   POST   /users(.:format)                       {:action=>"create", :controller=>"users"}
          new_user GET    /users/new(.:format)                   {:action=>"new", :controller=>"users"}
     user_question GET    /:user_id/:question_id(.:format)       {:controller=>"questions", :action=>"show"}
              user GET    /:user_id(.:format)                    {:controller=>"user", :action=>"show"}
 

4voto

mark Points 5174

Pas sûr de l'imbrication mais essayez

 :path => '/'
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X