Hỏi nhẹ: So sánh scope và namespace Rails routes

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