sự khác biệt giữa phạm vi và không gian tên của định tuyến ruby-on-rails 3


110

Tôi không thể hiểu sự khác biệt giữa không gian tên và phạm vi trong định tuyến của ruby-on-rails 3.

Ai đó có thể vui lòng giải thích?

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

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

Câu trả lời:


105

Sự khác biệt nằm ở các đường dẫn được tạo ra.

Các đường dẫn là admin_posts_pathadmin_comments_pathcho không gian tên, trong khi chúng chỉ posts_pathcomments_path cho phạm vi.

Bạn có thể nhận được kết quả tương tự như một không gian tên bằng cách chuyển :name_prefixtùy chọn vào phạm vi.


1
bằng đường dẫn bạn có nghĩa là tên người trợ giúp phải không? tôi không hiểu chức năng của phạm vi. nó (: module => "admin") sẽ làm gì nếu không có gì thay đổi?
never_had_a_name

2
Nó thay đổi các đường dẫn thực tế được sử dụng bởi các đường dẫn tuyến thành "/ admin / anything", giống như không gian tên. Sự khác biệt duy nhất là tiền tố được thêm vào các phương thức trợ giúp.
thay thế

32
Để hiểu rõ hơn về sự khác biệt: hãy xem xét sử dụng phạm vi bản địa hóa qua URL và không gian tên để lồng vào nhau, ví dụ: url: domain.com/nl/admin/panel . Nl là một phạm vi và admin là một không gian tên.
Valentin Vasilyev

70

ví dụ luôn giúp tôi, vì vậy đây là một ví dụ:

namespace :blog do
  resources :contexts
end

sẽ cung cấp cho chúng tôi các tuyến đường sau:

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

Sử dụng phạm vi ...

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

Sẽ cung cấp cho chúng tôi:

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

Đây là một số bài đọc hay về chủ đề này: http://edgeguides.rubyonrails.org/routing.html#controller-namespaces-and-routing


1
Vì vậy, nếu bạn không sử dụng phạm vi ở đây và chỉ có: nguồn: bối cảnh, bộ điều khiển sẽ không được lồng vào nhau trên blog: blog / bối cảnh
berto77

55

từ hướng dẫn đường ray

"Phạm vi không gian tên sẽ tự động thêm :ascũng như :module:path tiền tố."

vì thế

namespace "admin" do
  resources :contexts
end

giống như

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

2

Cả phạm vikhông gian tên đều xác định phạm vi một tập hợp các tuyến đường đến các tùy chọn mặc định đã cho.
Ngoại trừ việc không có tùy chọn mặc định cho phạm vi , và cho không gian tên :path , :as, :module, :shallow_path:shallow_prefixtùy chọn tất cả mặc định để tên của namespace.

Các tùy chọn có sẵn cho cả phạm vikhông gian tên tương ứng với những tùy chọn phù hợp .


1

phạm vi hơi phức tạp, nhưng cung cấp nhiều tùy chọn hơn để tinh chỉnh chính xác những gì bạn muốn làm.

phạm vi hỗ trợ ba tùy chọn: mô-đun, đường dẫn và dưới dạng . Nếu bạn thấy phạm vi với tất cả các tùy chọn, nó sẽ giống hệt như không gian tên.

Nói cách khác, các tuyến đường được tạo bởi

namespace :admin do
  resources :posts
end

giống như

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

Nói cách khác, chúng ta có thể nói rằng không có tùy chọn mặc định cho phạm vi so với không gian tên. không gian tên thêm tất cả các tùy chọn này theo mặc định. Do đó, sử dụng phạm vi, chúng tôi có thể tinh chỉnh các tuyến đường theo yêu cầu.

Nếu bạn xem xét sâu về phạm vi và hành vi mặc định của không gian tên , bạn sẽ thấy rằng phạm vi theo mặc định chỉ hỗ trợ : tùy chọn đường dẫn , trong đó không gian tên hỗ trợ ba mô-đun tùy chọn , đường dẫn và theo mặc định.

Để biết thêm thông tin, vui lòng tham khảo không gian tên-và-định tuyến tài liệu .


Và nếu bạn đang cố gắng đặt, vì bất kỳ lý do gì, một tham số bắt buộc, thì scope là giải pháp tốt nhất.
Fábio Araújo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.