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

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.


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


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

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 .


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 .


Et si vous essayez de mettre, pour une raison quelconque, un paramètre obligatoire, scope est la meilleure solution.
Fábio Araújo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.