разница между областью видимости и пространством имен маршрутизации ruby-on-rails 3

110

Я не могу понять, в чем разница между пространством имен и областью видимости в маршрутизации ruby-on-rails 3.

Может кто-нибудь объяснить?

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

scope :module => "admin" do
  resources :posts, :comments
end
never_had_a_name
источник

Ответы:

105

Разница заключается в созданных путях.

Пути - это admin_posts_pathи admin_comments_pathдля пространства имен, тогда как они просто posts_pathи comments_pathдля области видимости.

Вы можете получить тот же результат, что и пространство имен, передав :name_prefixпараметр в область видимости.

альтернатива
источник
1
под путями вы имеете в виду имена помощников, верно? я не понимаю функциональность прицела. что он (: module => "admin") делает, если ничего не меняется?
never_had_a_name
2
Он изменяет фактические пути, используемые путями маршрутов, на «/ admin / something», как и пространство имен. Единственное отличие - это префикс, добавляемый к вспомогательным методам.
альтернатива
32
Чтобы лучше понять разницу: рассмотрите возможность использования областей для локализации через URL-адрес и пространства имен для вложения, например url: domain.com/nl/admin/panel . Nl - это область, а admin - это пространство имен.
Валентин Васильев
70

примеры всегда помогают мне, так что вот пример:

namespace :blog do
  resources :contexts
end

даст нам следующие маршруты:

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

Использование области видимости ...

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

Дадут нам:

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

Вот хорошее чтение по этому поводу: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

ynkr
источник
1
Итак, если бы вы не использовали здесь область видимости и просто имели: resources: contexts, контроллер не был бы вложен в blog: blog / contexts
berto77 06
55

от направляющих рельсов

«Область пространства имен автоматически добавит, :asа также префиксы :moduleи :path».

так

namespace "admin" do
  resources :contexts
end

такой же как

scope "/admin", as: "admin", module: "admin" do
  resources :contexts
end
Монреальмайк
источник
2

И область действия, и пространство имен охватывают набор маршрутов для заданных параметров по умолчанию.
За исключением того, что нет никаких вариантов по умолчанию для сферы , так и для пространства имен :path , :as, :module, :shallow_pathи :shallow_prefixпараметры по умолчанию все с именем пространства имен.

Доступные параметры для области и пространства имен соответствуют параметрам match .

lakesare
источник
1

scope немного сложен, но предоставляет больше возможностей для точной настройки того, что вы хотите сделать.

scope поддерживает три варианта: модуль, путь и как . Если вы видите область со всеми ее параметрами, она будет точно такой же, как и пространство имен.

Другими словами, маршруты, созданные

namespace :admin do
  resources :posts
end

такой же как

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

Другими словами, мы можем сказать, что нет параметров по умолчанию для области видимости по сравнению с пространством имен. пространство имен добавляет все эти параметры по умолчанию. Таким образом, используя область видимости, мы можем более точно настроить маршруты по мере необходимости.

Если вы глубоко изучите поведение области и пространства имен по умолчанию, вы обнаружите, что эта область по умолчанию поддерживает только параметр : path , где as пространство имен поддерживает три параметра: module, path и as по умолчанию.

Для получения дополнительной информации см. Doc namespace-and-routing .

ВК Сингх
источник
И если вы по какой-либо причине пытаетесь указать обязательные параметры, лучшим решением будет область видимости.
Fábio Araújo,