różnica między zakresem i przestrzenią nazw routingu ruby-on-rails 3


110

Nie mogę zrozumieć, jaka jest różnica między przestrzenią nazw a zakresem w routingu ruby-on-rails 3.

Czy mógłby ktoś wyjaśnić?

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

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

Odpowiedzi:


105

Różnica polega na generowanych ścieżkach.

Ścieżki są admin_posts_pathi admin_comments_pathdla przestrzeni nazw, podczas gdy są sprawiedliwe posts_pathi comments_pathdla zakresu.

Możesz uzyskać ten sam wynik, co przestrzeń nazw, przekazując :name_prefixopcję do zakresu.


1
przez ścieżki masz na myśli nazwy pomocników, prawda? nie rozumiem funkcjonalności zakresu. co robi (: module => "admin"), jeśli nic się nie zmieni?
never_had_a_name

2
Zmienia rzeczywiste ścieżki używane przez ścieżki tras na „/ admin / cokolwiek”, podobnie jak przestrzeń nazw. Jedyną różnicą jest przedrostek dodawany do metod pomocniczych.
alternatywnie

32
Aby lepiej zrozumieć różnicę: rozważ użycie zakresów do lokalizacji za pomocą adresu URL i przestrzeni nazw do zagnieżdżenia, na przykład url: domena.com/nl/admin/panel . Nl to zakres, a admin to przestrzeń nazw.
Valentin Wasiljew

70

przykłady zawsze mi pomagają, więc oto przykład:

namespace :blog do
  resources :contexts
end

poda nam następujące trasy:

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

Korzystanie z zakresu ...

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

Da nam:

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

Oto dobra lektura na ten temat: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing


1
Więc jeśli nie
użyłeś

55

z prowadnicy szyn

„Zakres przestrzeni nazw zostanie automatycznie dodany, :asa także :modulei :pathprzedrostki”.

więc

namespace "admin" do
  resources :contexts
end

jest taki sam jak

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

2

Zarówno zakres i nazw są scoping zestaw tras do danej opcji domyślnych.
Tyle tylko, że nie istnieją żadne opcje domyślne dla zakresu , a do nazw :path , :as, :module, :shallow_pathi:shallow_prefix wszystko Opcje domyślne nazwy przestrzeni nazw.

Dostępne opcje zarówno dla zakresu i obszaru nazw odpowiadają postanowieniom meczu .


1

zakres jest nieco skomplikowany, ale zapewnia więcej opcji do precyzyjnego dostrojenia tego, co chcesz zrobić.

zakres obsługuje trzy opcje: moduł, ścieżka i jako . Jeśli zobaczysz zakres ze wszystkimi opcjami it, będzie dokładnie taki sam jak przestrzeń nazw.

Innymi słowy, trasy generowane przez

namespace :admin do
  resources :posts
end

jest taki sam jak

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

Innymi słowy, możemy powiedzieć, że nie ma domyślnych opcji zakresu w porównaniu z przestrzenią nazw. przestrzeń nazw domyślnie dodaje wszystkie te opcje. W ten sposób używając zakresu, możemy bardziej precyzyjnie dostroić trasy zgodnie z wymaganiami.

Jeśli przyjrzysz się dogłębnie domyślnemu zachowaniu zakresu i przestrzeni nazw , zauważysz, że zakres domyślnie obsługuje tylko : opcję ścieżki , gdzie jako przestrzeń nazw obsługuje trzy moduły opcji , ścieżkę i domyślnie.

Aby uzyskać więcej informacji, zapoznaj się z przestrzenią nazw i routingiem dokumentów .


A jeśli z jakiegoś powodu próbujesz wprowadzić wymagane parametry, najlepszym rozwiązaniem jest zakres.
Fábio Araújo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.