ruby-on-rails'in kapsam ve ad alanı arasındaki fark 3 yönlendirme


110

Ruby-on-rails'in yönlendirilmesinde bir ad alanı ile kapsam arasındaki farkın ne olduğunu anlayamıyorum 3.

Biri açıklayabilir mi lütfen?

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

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

Yanıtlar:


105

Fark, oluşturulan yollarda yatmaktadır.

Yollarıdır admin_posts_pathve admin_comments_pathonlar sadece iken, ad alanı için posts_pathve comments_pathkapsam için.

Bir ad alanıyla aynı sonucu :name_prefixkapsam seçeneğine geçerek elde edebilirsiniz .


1
yollarla yardımcı isimleri kastediyorsunuz değil mi? Kapsamın işlevselliğini anlamıyorum. hiçbir şey değişmezse bu (: module => "admin") ne yapar?
never_had_a_name

2
Aynı ad alanı gibi, yol yolları tarafından kullanılan gerçek yolları "/ admin / her neyse" olarak değiştirir. Tek farklı, yardımcı yöntemlere eklenen önektir.
alternatif

32
Farkı daha iyi anlamak için: URL aracılığıyla yerelleştirme için kapsamları ve iç içe yerleştirme için ad alanı kullanmayı düşünün, örneğin url: domain.com/nl/admin/panel . Nl bir kapsam ve admin bir ad alanıdır.
Valentin Vasilyev

70

örnekler her zaman bana yardımcı olur, işte bir örnek:

namespace :blog do
  resources :contexts
end

bize aşağıdaki yolları verecektir:

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

Kapsam kullanılıyor ...

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

Bize verecek:

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

Konuyla ilgili bazı güzel okumalar: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing


1
Yani burada kapsamı kullanmadıysanız ve şu
öğeye sahip olsaydınız

55

dan raylar kılavuz

"Ad kapsamı otomatik katacak :ashem de :moduleve :pathönekleri."

yani

namespace "admin" do
  resources :contexts
end

aynıdır

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

2

Hem kapsam hem de ad alanı , verilen varsayılan seçeneklere bir dizi yolun kapsamını alıyor.
Orada hiçbir varsayılan seçenekler olması dışında kapsam ve için ad :path , :as, :module, :shallow_pathve :shallow_prefixad alanının adının seçenekleri tüm varsayılan.

Mevcut seçenekler hem kapsam ve ad olanların tekabül maçı .


1

kapsam biraz karmaşıktır, ancak tam olarak yapmak istediğiniz şeye ince ayar yapmak için daha fazla seçenek sunar.

kapsam üç seçeneği destekler : modül, yol ve as . Tüm seçeneklerin bulunduğu kapsam görürseniz, ad alanıyla tamamen aynı olacaktır.

Başka bir deyişle, tarafından oluşturulan rotalar

namespace :admin do
  resources :posts
end

aynı

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

Başka bir deyişle, ad alanına kıyasla kapsam için varsayılan seçenekler olmadığını söyleyebiliriz . ad alanı tüm bu seçenekleri varsayılan olarak ekler. Böylece, kapsam kullanarak rotaları gerektiği gibi daha ince ayarlayabiliriz.

Kapsam ve ad alanı varsayılan davranışına derinlemesine bakarsanız , bu kapsamın yalnızca varsayılan olarak desteklediğini göreceksiniz : ad alanı üç seçenek modülünü, yol ve varsayılan olarak desteklediğinden yol seçeneği .

Daha fazla bilgi için lütfen bir belge ad alanına ve yönlendirmesine bakın .


Ve herhangi bir nedenle gerekli bir parametre koymaya çalışıyorsanız, kapsam en iyi çözümdür.
Fábio Araújo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.