diferencia entre el alcance y el espacio de nombres del enrutamiento de ruby-on-rails 3

110

No puedo entender cuál es la diferencia entre un espacio de nombres y un alcance en el enrutamiento de ruby-on-rails 3.

¿Podría alguien explicarme?

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

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

Respuestas:

105

La diferencia radica en los caminos generados.

Las rutas son admin_posts_pathy admin_comments_pathpara el espacio de nombres, mientras que son justas posts_pathy comments_pathpara el alcance.

Puede obtener el mismo resultado que un espacio de nombres pasando la :name_prefixopción al alcance.

alternativa
fuente
1
por caminos te refieres a los nombres de los ayudantes, ¿verdad? No entiendo la funcionalidad del osciloscopio. ¿Qué hace (: module => "admin") si nada cambia?
never_had_a_name
2
Cambia las rutas reales utilizadas por las rutas de ruta a "/ admin / lo que sea", al igual que el espacio de nombres. La única diferencia es el prefijo agregado a los métodos auxiliares.
alternativa
32
Para comprender mejor la diferencia: considere usar ámbitos para la localización a través de URL y espacio de nombres para anidar, por ejemplo, url: domain.com/nl/admin/panel . El nl es un alcance y el administrador es un espacio de nombres.
Valentin Vasilyev
70

los ejemplos siempre me ayudan, así que aquí hay un ejemplo:

namespace :blog do
  resources :contexts
end

nos dará las siguientes rutas:

    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"}

Usando el alcance ...

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

Nos dará:

     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"}

Aquí hay una buena lectura sobre el tema: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

ynkr
fuente
1
Entonces, si no usó el alcance aquí y solo tuvo: recursos: contextos, el controlador no estaría anidado en blog: blog / contexts
berto77
55

de la guía de rieles

"El alcance de espacio de nombres añadirá automáticamente :as, así como :moduley :pathprefijos."

entonces

namespace "admin" do
  resources :contexts
end

es lo mismo que

scope "/admin", as: "admin", module: "admin" do
  resources :contexts
end
Montreal
fuente
2

Tanto el alcance como el espacio de nombres están definiendo un conjunto de rutas a las opciones predeterminadas dadas.
Excepto que no hay opciones por defecto para el alcance , y por espacio de nombres :path , :as, :module, :shallow_pathy :shallow_prefixtodas las opciones por defecto para el nombre del espacio de nombres.

Las opciones disponibles tanto para el alcance como para el espacio de nombres corresponden a las de coincidencia .

lagos son
fuente
1

El alcance es un poco complejo, pero ofrece más opciones para ajustar exactamente lo que desea hacer.

El alcance admite tres opciones: módulo, ruta y como . Si ve el alcance con todas sus opciones, será exactamente igual que el espacio de nombres.

En otras palabras, las rutas generadas por

namespace :admin do
  resources :posts
end

es lo mismo que

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

En otras palabras, podemos decir que no hay opciones predeterminadas para el alcance en comparación con el espacio de nombres. espacio de nombres agrega todas estas opciones por defecto. Por lo tanto, utilizando el alcance, podemos ajustar más las rutas según sea necesario.

Si analiza en profundidad el alcance y el comportamiento predeterminado del espacio de nombres , encontrará que el alcance por defecto solo admite : opción de ruta , donde el espacio de nombres admite tres opciones módulo, ruta y como por defecto.

Para obtener más información, consulte un documento de espacio de nombres y enrutamiento .

VK Singh
fuente
Y si está intentando poner, por cualquier motivo, un parámetro obligatorio, el alcance es la mejor solución.
Fábio Araújo