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

110

Je ne comprends pas quelle est la différence entre un espace de noms et une portée dans le routage de ruby-on-rails 3.

Quelqu'un pourrait-il expliquer?

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

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

Réponses:

105

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

Les chemins sont admin_posts_pathet admin_comments_pathpour l'espace de noms, alors qu'ils sont justes posts_pathet comments_pathpour la portée.

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

alternative
la source
1
par chemins, vous voulez dire les noms des assistants, non? Je ne comprends pas la fonctionnalité de la portée. que fait-il (: module => "admin") si rien ne change?
never_had_a_name
2
Il change les chemins réels utilisés par les chemins de route en "/ admin / peu importe", tout comme l'espace de noms. La seule différence est le préfixe ajouté aux méthodes d'assistance.
alternative
32
Pour mieux comprendre la différence: envisagez d'utiliser des étendues pour la localisation via une URL et un espace de noms pour l'imbrication, par exemple l'url: domain.com/nl/admin/panel . Le nl est une portée et admin est un espace de noms.
Valentin Vasilyev
70

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

Nous donnera:

     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 quelques bonnes lectures sur le sujet: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

ynkr
la source
1
Donc, si vous n'utilisiez pas scope ici et que vous aviez juste: resources: contextts, le contrôleur ne serait pas imbriqué sur blog: blog /
contextts
55

du guide des rails

"La portée de l'espace de noms ajoutera automatiquement :asainsi que les préfixes :moduleet :path."

alors

namespace "admin" do
  resources :contexts
end

est le même que

scope "/admin", as: "admin", module: "admin" do
  resources :contexts
end
montréal
la source
2

L' étendue et l' espace de noms 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 la portée et de l' espace de noms :path , :as, :module, :shallow_pathet les :shallow_prefixoptions par défaut tout au nom de l'espace de noms.

Les options disponibles pour la portée et l' espace de noms correspondent à celles de match .

Lakesare
la source
1

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

scope prend en charge trois options: module, path et as . Si vous voyez la portée avec toutes ses options, ce sera exactement la même chose que l'espace de noms.

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

namespace :admin do
  resources :posts
end

est le même que

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 la portée par rapport à l'espace de noms. namespace ajoute toutes ces options par défaut. Ainsi, en utilisant la portée, nous pouvons affiner les routes selon les besoins.

Si vous examinez en profondeur le comportement par défaut de la portée et de l' espace de noms , vous constaterez que la portée par défaut ne prend en charge que : l' option de chemin , où l' espace de noms prend en charge trois modules d' options , le chemin et comme par défaut.

Pour plus d'informations, veuillez consulter un doc namespace-and-routing .

VK Singh
la source
Et si vous essayez de mettre, pour une raison quelconque, un paramètre obligatoire, scope est la meilleure solution.
Fábio Araújo