Hỏi nhẹ: So sánh scope và namespace Rails routes
Bài đăng này đã không được cập nhật trong 6 năm
Tự nhiên tìm thấy một cái link hay hay nên mình xin phép được viết lại để chia sẽ với mọi người, cũng là để ghi nhớ kiến thức luôn (hehe)
https://devblast.com/b/rails-5-routes-scope-vs-namespace
Ở đây nói về sự khác biệt của namespace và scope trong Rails routes. Đây là điều khá quan trọng, bởi vì nó ảnh hưởng đến đường dẫn của tài nguyên của bạn và bộ điều khiển.
namespace
Đây là lựa chọn đơn giản. Khi bạn sử dụng namespace, nó sẽ thêm tiền tố đường dẫn URL cho các tài nguyên được chỉ định, và cố gắng xác định vị trí controller theo một mô-đun có tên giống như tên namespace của bạn
Ví dụ:
namespace :admin do
resources :users
end
Kết quả:
Prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
admin_users | GET | /admin/users(.:format) | admin/users#index |
| | POST |/admin/users(.:format) | admin/users#create|
|admin_user |GET |/admin/users/:id(.:format) |admin/users#show| || PATCH | /admin/users/:id(.:format)| admin/users#update| || PUT | /admin/users/:id(.:format)| admin/users#update| ||DELETE |/admin/users/:id(.:format) |admin/users#destroy|
Như bạn thấy, admin đã được thêm vào như một tiền tố trong đường dẫn URI (/admin/users), path "admin_users", "admin_user " và như là một module chứa bộ điều khiển (admin/users#index). Rails sẽ mong đợi Admin :: UsersController được đặt tại app/controllers/admin/users_controller.rb
scope
scope phức tạp hơn namespace một chút - nhưng có ưu điểm là nó cho phép bạn nhiều lựa chọn hơn để tinh chỉnh chính xác những gì bạn muốn làm.
scope with no options
Khi sử dụng scope mà không có bất kỳ tùy chọn và chỉ có tên scope, nó sẽ chỉ thay đổi URI Pattern
Ví dụ:
scope :admin do
resources :users
end
Kết quả:
Prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
users | GET | /admin/users(.:format) | users#index |
POST | /admin/users(.:format) | users#create | |
user | GET | /admin/users/:id(.:format) | users#show |
PATCH | /admin/users/:id(.:format) | users#update | |
PUT | /admin/users/:id(.:format) | users#update |
|| DELETE |/admin/users/:id(.:format) |users#destroy|
Như bạn thấy, admin đã được thêm vào URI Pattern trước /users, nhưng users controller không phải nằm bên trong bất kỳ module nào và path cũng ko đổi
scope with options
scope cung cấp 3 options: module, path, as
module
module giúp chúng ta chỉ ra controller sẽ được chứa trong module name nào
Ví dụ:
scope module: 'admin' do
resources :users
end
Kết quả:
Prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
users | GET | /users(.:format) | admin/users#index |
|| POST | /users(.:format) | admin/users#create|
| user |GET | /users/:id(.:format) |admin/users#show| || PATCH |/users/:id(.:format)| admin/users#update| || PUT | /users/:id(.:format)| admin/users#update| ||DELETE |/users/:id(.:format) |admin/users#destroy|
Như bạn có thể thấy, URI và Đường dẫn ko thay đổi, tuy nhiên Rails sẽ mong đợi Admin :: UsersController được đặt tại app/controllers/admin/users_controller.rb
path
path cho phép chúng ta đặt tiền tố sẽ xuất hiện trong URI, trước tên tài nguyên.
Ví dụ:
scope module: 'admin', path: 'fu' do
resources :users
end
Kết quả:
Prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
users | GET | /fu/users(.:format) | admin/users#index |
POST | /fu/users(.:format) | admin/users#create | |
user | GET | /fu/users/:id(.:format) | admin/users#show |
PATCH | /fu/users/:id(.:format) | admin/users#update |
|| PUT | /fu/users/:id(.:format)| admin/users#update|
|| DELETE |/fu/users/:id(.:format)| admin/users#destroy|
"fu" đã được thêm vào URI Pattern trước "/users"
as
Cuối cùng, as có thể được sử dụng để thay đổi tên của đường dẫn sử dụng để xác định tài nguyên
Ví dụ:
scope module: 'admin', path: 'fu', as: 'cool' do
resources :users
end
Kết quả:
Prefix | Verb | URI Pattern | Controller#Action |
---|---|---|---|
cool_users | GET | /fu/users(.:format) | admin/users#index |
POST | /fu/users(.:format) | admin/users#create | |
cool_user | GET | /fu/users/:id(.:format) | admin/users#show |
|| PATCH| /fu/users/:id(.:format)| admin/users#update|
|| PUT | /fu/users/:id(.:format) |admin/users#update|
|| DELETE| /fu/users/:id(.:format) |admin/users#destroy|
Trong trường hợp này, bây giờ chúng ta có "cool" như là tiền tố cho tên đường dẫn "cool_users" và "cool_user"
Túm lại
nếu bạn sử dụng:
scope module: 'admin', path: 'admin', as: 'admin' do
resources :users
end
thì nó sẽ tương đương với
namespace :admin do
resources :users
end
Còn nhiều điều hay ho về Rails routes nữa, hẹn gặp lại các bạn ở những bài viết sau (yaoming)
Mr.nara
All rights reserved