perbedaan antara ruang lingkup dan namespace dari perutean ruby-on-rails 3

110

Saya tidak mengerti apa perbedaan antara namespace dan ruang lingkup dalam perutean ruby-on-rails 3.

Bisakah seseorang menjelaskan?

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

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

Jawaban:

105

Perbedaannya terletak pada jalur yang dihasilkan.

Paths adalah admin_posts_pathdan admin_comments_pathuntuk namespace, sementara itu adil posts_pathdan comments_pathuntuk ruang lingkup.

Anda bisa mendapatkan hasil yang sama sebagai namespace dengan meneruskan :name_prefixopsi ke scope.

alternatif
sumber
1
menurut jalan yang u maksud nama pembantu kan? saya tidak mengerti fungsionalitas ruang lingkup. apa yang (: module => "admin") lakukan jika tidak ada yang berubah?
never_had_a_name
2
Ini mengubah jalur sebenarnya yang digunakan oleh jalur rute ke "/ admin / apa saja", seperti namespace. Satu-satunya perbedaan adalah prefiks yang ditambahkan ke metode helper.
alternatif
32
Untuk lebih memahami perbedaannya: pertimbangkan untuk menggunakan cakupan untuk pelokalan melalui URL dan namespacing untuk penumpukan, misalnya url: domain.com/nl/admin/panel . Nl adalah ruang lingkup, dan admin adalah ruang nama.
Valentin Vasilyev
70

Contoh selalu membantu saya, jadi inilah contohnya:

namespace :blog do
  resources :contexts
end

akan memberi kita rute berikut:

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

Menggunakan ruang lingkup ...

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

Akan memberi kami:

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

Berikut adalah beberapa bacaan bagus tentang subjek: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing

ynkr
sumber
1
Jadi jika Anda tidak menggunakan cakupan di sini dan hanya memiliki: resource: konteks, pengontrol tidak akan bersarang di blog: blog /
contexts
55

dari panduan rel

"Ruang lingkup namespace akan secara otomatis menambahkan :asserta :moduledan :pathprefiks."

begitu

namespace "admin" do
  resources :contexts
end

sama dengan

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

Baik cakupan maupun namespace mencakup sekumpulan rute ke opsi default yang diberikan.
Kecuali bahwa tidak ada pilihan default untuk lingkup , dan untuk namespace :path , :as, :module, :shallow_pathdan:shallow_prefix pilihan semua default ke nama namespace.

Opsi yang tersedia untuk cakupan dan namespace sesuai dengan yang cocok .

danau
sumber
1

Scope agak rumit, tetapi menyediakan lebih banyak opsi untuk menyesuaikan dengan tepat apa yang ingin Anda lakukan.

lingkup mendukung tiga opsi: modul, jalur dan sebagai . Jika Anda melihat cakupan dengan semua opsi itu, itu akan persis sama dengan namespace.

Dengan kata lain, rute dihasilkan oleh

namespace :admin do
  resources :posts
end

sama seperti

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

Dengan kata lain, kita dapat mengatakan bahwa tidak ada opsi default untuk cakupan dibandingkan dengan namespace. namespace menambahkan semua opsi ini secara default. Dengan demikian, dengan menggunakan scope, kami dapat lebih menyempurnakan rute sesuai kebutuhan.

Jika Anda melihat lebih dalam cakupan dan perilaku default namespace , Anda akan menemukan bahwa cakupan secara default hanya mendukung : opsi jalur, sedangkan namespace mendukung modul tiga opsi , jalur, dan sebagai default.

Untuk info lebih lanjut, lihat doc namespace-and-routing .

VK Singh
sumber
Dan jika Anda mencoba menempatkan, untuk alasan apa pun, parameter yang diperlukan, cakupan adalah solusi terbaik.
Fábio Araújo