How To Namespace Controllers In Rails
Bài đăng này đã không được cập nhật trong 8 năm
Namespacing controllers - hay được hiểu là không gian tên của controller trong một ứng dụng Ruby on Rails là một cách tuyệt vời để đáp ứng các tính năng khác nhau: invoicing, xác thực,.. Nó cũng khá đơn giản để thi hành, do đó bài viết này bạn có thể bỏ qua nếu đã biết tới nó.
The initial state: Trạng thái khởi tạo
Hãy bắt đầu với một ví dụ với một controller có tên là ProposalsController
:
# app/controllers/proposals_controller.rb
class ProposalsController < ApplicationController
def index
# something cool is probably happening here
end
end
File này được đặt trong app/controllers/proposals_controller.rb
, và khai báo routes tương ứng là
# routes.rb
resources :proposals, only: [:index]
Moving things up: Di chuyển controller đó
Bây giờ giả sử chúng ta muốn di chuyển controller đó vào trong một module có tên là Invoice
. Dưới đây là các bước theo thứ tự từng bước để tạo ra một không gian tên cho nó.
1. Tạo thư mục app/controllers/invoice
Điều đầu tiên chúng ta phải làm là tạo một thư mục mới trong app/controllers
, có tên là invoice
.
2. Di chuyển file proposals_controller.rb
vào trong thư mục mới
Chúng ta di chuyển file định nghĩa controller proposals_controller.rb
phía trên vào thư mục mới tạo này invoice
.
3. Thêm không gian tên cho ProposalsController
Việc này có thể được thực hiện khá đơn giản với từ khóa module
của Ruby, nó sẽ đóng gói lớp ProposalsController
vào trong không gian tên này.
# app/controllers/invoice/proposals_controller.rb
module Invoice
class ProposalsController < ApplicationController
def index
# something cool is probably happening here
end
end
end
4. Thêm một scope hoặc một namespace trong file routes
Để có thể sửa file routes.rb
với thay đổi không gian tên của class ProposalsController
phía trên, chúng ta có hai tùy chọn dựa vào điều chúng ta muốn thay đổi đường dẫn URI hay không.
Với giải pháp đầu tiên sử dụng từ khóa namespace
sẽ thay đổi đường dẫn mới trên trình duyệt của bạn sẽ là /invoice/proposals
, và nó sẽ sử dụng controller được đặt tương ứng là app/controllers/invoice/proposals_controller.rb
.
# routes.rb
namespace :invoice do
resources :proposals, only: [:index]
end
Với giải pháp thứ hai là sử dụng từ khóa module
sẽ không thay đổi đường dẫn URI. Các phương thức vẫn xuất hiện trong /proposals
, và sử dụng controller đặt tại app/controllers/invoice/proposals_controller.rb
.
# routes.rb
scope module: :invoice do
resources :proposals, only: [:index]
end
The End
Như vậy với các bước khá đơn giản trên hi vọng sẽ giúp bạn tạo ra các không gian tên cho ứng dụng của mình với những mục đích khác nhau.
References
All rights reserved