+1

How To Namespace Controllers In Rails

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

Organizing large rails projects with namespaces

How To Namespace Controllers In Rails


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí