2010-05-05 6 views
3

Vu le fichier routes.rb suivant:Aliasing une route dans Rails espaces de noms

# Add Admin section routes 
map.namespace :admin do |admin| 
    admin.resources :admin_users 
    admin.resources :admin_user_sessions, :as => :sessions 
    admin.resources :dashboard 

    # Authentication Elements 
    admin.login '/login', :controller => 'admin_user_sessions', :action => 'new'  
    admin.logout '/logout', :controller => 'admin_user_sessions', :action => 'destroy' 

    # Default is login page for admin_users 
    admin.root :controller => 'admin_user_sessions', :action => 'new' 
end 

Est-il possible de créer un alias de la section 'admin' à autre chose sans avoir à changer chaque redirection et link_to dans l'application? La raison principale est que c'est quelque chose que j'aimerais être configurable à la volée et que j'espère rendre un peu moins facile à deviner. La méthode

Répondre

7

map.namespace définit simplement quelques options communes pour les routes à l'intérieur de son bloc. Il utilise with_options méthode:

# File actionpack/lib/action_controller/routing/route_set.rb, line 47 
     def namespace(name, options = {}, &block) 
      if options[:namespace] 
      with_options({:path_prefix => "#{options.delete(:path_prefix)}/#{name}", :name_prefix => "#{options.delete(:name_prefix)}#{name}_", :namespace => "#{options.delete(:namespace)}#{name}/" }.merge(options), &block) 
      else 
      with_options({:path_prefix => name, :name_prefix => "#{name}_", :namespace => "#{name}/" }.merge(options), &block) 
      end 
     end 

Il est donc possible d'utiliser la méthode with_options directement au lieu de namespace:

map.with_options(:path_prefix => "yournewprefix", :name_prefix => "admin_", :namespace => "admin/") do |admin| 
    admin.resources :admin_users 
    # .... 
end 

Et vous pouvez continuer à utiliser des routes de la même manière que précédemment, mais le préfixe sera " yournewprefix » au lieu de « admin »

admin_admin_users_path #=> /yournewprefix/admin_users 
+0

Thx a fonctionné parfaitement! – khelal

4

afin de créer un alias à l'espace de noms (appeler un api_version pour par exemple, d'une autre adresse de routeur), vous pouvez effectuer les opérations suivantes:

#routes.rb 
%w(v1 v2).each do |api_version| 
    namespace api_version, api_version: api_version, module: :v1 do 
    resources :some_resource 
    #... 
    end 
end 

cela entraînera les routes /v1/some_resource et /v2/some_resource pour arriver au même contrôleur. alors vous pouvez utiliser params[:api_version] pour obtenir l'information dont vous avez besoin et répondre en conséquence.

3

Comme dans toute autre ressource,: chemin semble fonctionner correctement pour moi.

namespace :admin, :path => "myspace" do 
    resources : notice 
    resources :article do 
     resources :links , :path => "url" 
    end 
    end 
end