web-dev-qa-db-fra.com

différence entre la portée et l'espace de noms du routage Ruby-on-Rails 3

Je ne comprends pas quelle est la différence entre un espace de noms et une étendue dans le routage de Ruby-on-Rails 3.

Quelqu'un pourrait-il s'il vous plaît expliquer?

namespace "admin" do
  resources :posts, :comments
end

scope :module => "admin" do
  resources :posts, :comments
end
105
never_had_a_name

La différence réside dans les chemins générés.

Les chemins sont admin_posts_path et admin_comments_path pour l’espace de noms, alors qu’ils ne sont que posts_path et comments_path pour la portée.

Vous pouvez obtenir le même résultat qu'un espace de noms en passant l'option :name_prefix à scope.

99
alternative

les exemples m'aident toujours, alors voici un exemple:

namespace :blog do
  resources :contexts
end

nous donnera les itinéraires suivants:

    blog_contexts GET    /blog/contexts(.:format)          {:action=>"index", :controller=>"blog/contexts"}
                  POST   /blog/contexts(.:format)          {:action=>"create", :controller=>"blog/contexts"}
 new_blog_context GET    /blog/contexts/new(.:format)      {:action=>"new", :controller=>"blog/contexts"}
edit_blog_context GET    /blog/contexts/:id/edit(.:format) {:action=>"edit", :controller=>"blog/contexts"}
     blog_context GET    /blog/contexts/:id(.:format)      {:action=>"show", :controller=>"blog/contexts"}
                  PUT    /blog/contexts/:id(.:format)      {:action=>"update", :controller=>"blog/contexts"}
                  DELETE /blog/contexts/:id(.:format)      {:action=>"destroy", :controller=>"blog/contexts"}

Utilisation de la portée ...

scope :module => 'blog' do
  resources :contexts
end

Va nous donner:

     contexts GET    /contexts(.:format)           {:action=>"index", :controller=>"blog/contexts"}
              POST   /contexts(.:format)           {:action=>"create", :controller=>"blog/contexts"}
  new_context GET    /contexts/new(.:format)       {:action=>"new", :controller=>"blog/contexts"}
 edit_context GET    /contexts/:id/edit(.:format)  {:action=>"edit", :controller=>"blog/contexts"}
      context GET    /contexts/:id(.:format)       {:action=>"show", :controller=>"blog/contexts"}
              PUT    /contexts/:id(.:format)       {:action=>"update", :controller=>"blog/contexts"}
              DELETE /contexts/:id(.:format)       {:action=>"destroy", :controller=>"blog/contexts"}

Voici une bonne lecture sur le sujet: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

63
ynkr

dans le guide Rails

"La portée de l’espace de nommage ajoutera automatiquement les préfixes :as ainsi que :module et :path."

alors

namespace "admin" do
  resources :contexts
end

est le même que

scope "/admin", as: "admin", module: "admin" do
  resources :contexts
end
50
montrealmike

Scope et namespace couvrent un ensemble de routes vers les options par défaut données.
Sauf qu'il n'y a pas d'options par défaut pour scope et pour namespace:path, :as, :module, :shallow_path et :shallow_prefix et que toutes les options par défaut sont nommées. 

Les options disponibles pour scope et namespace correspondent à celles de match.

2
lakesare

scope est un peu complexe, mais offre plus d'options pour ajuster exactement ce que vous voulez faire.

scope supporte trois options: module, chemin et comme. Si vous voyez une portée avec toutes les options it, ce sera exactement la même chose que namespace.

En d’autres termes, les itinéraires générés par

namespace :admin do
  resources :posts
end

est identique à

scope module: 'admin', path: 'admin', as: 'admin' do
  resources :posts
end

En d'autres termes, nous pouvons dire qu'il n'y a pas d'options par défaut pour scope par rapport à un espace de noms. namespace ajoute toutes ces options par défaut. Ainsi, en utilisant scope, nous pouvons affiner les itinéraires au besoin.

Si vous examinez de manière approfondie le comportement par défaut de scope et namespace, vous constaterez que scope ne prend en charge par défaut que l'option : path, alors que namespace prend en charge trois options module, chemin et par défaut.

Pour plus d’informations, veuillez vous référer à la doc namespace-and-routing .

0
V K Singh