Resource routing trong rails phần 2

I. Giới thiệu

Ở phần trước chúng ta đã tìm hiểu một số khái niệm về resource routing trong rails và cách sử dụng, ở phần này chúng ta sẽ đi đến một khái niệm nữa đó là Nested Resources. Vậy Nested Resources mang lại cho chúng ta lợi ích gì và sử dụng nó như thế nào? Chúng ta sẽ cùng tìm hiểu ngay sau đây.

II. Nội dung

Nested Resources

  • Việc có các resource là con của các resource khác là điều phổ biến. Ví dụ: giả sử ứng dụng của bạn bao gồm các mô hình sau:
class Magazine < ApplicationRecord
  has_many :ads
end
 
class Ad < ApplicationRecord
  belongs_to :magazine
end
  • Nested routes cho phép bạn nắm bắt mối quan hệ này trong routing của bạn. Trong trường hợp này, bạn có thể bao gồm khai báo route này:
resources :magazines do
  resources :ads
end
  • Ngoài các routes cho magazines, khai báo này cũng sẽ định tuyến ads đến AdsContoder. Các ad URL yêu cầu một magazine:

1. Limits to Nesting

  • Bạn có thể lồng resources trong các nested resources khác nếu bạn muốn. Ví dụ:
resources :publishers do
  resources :magazines do
    resources :photos
  end
end
  • Deeply-nested resources nhanh chóng trở nên cồng kềnh. Trong trường hợp này, ví dụ, ứng dụng sẽ có các đường dẫn như:
/publishers/1/magazines/2/photos/3
  • Route helper tương ứng sẽ là publisher_magazine_photo_url, yêu cầu bạn chỉ định các đối tượng ở cả ba cấp độ. Thật vậy, tình huống này đủ khó hiểu khi một bài viết phổ biến của Jamis Buck đề xuất một quy tắc ngón tay cái cho thiết kế Rails tốt:

=> Resources should never be nested more than 1 level deep.

Tạm dịch: Resource không bao giờ được lồng sâu hơn 1 cấp.

2. Shallow Nesting

  • Một cách để tránh lồng nhau sâu (như được khuyến nghị ở trên) là tạo các hành động thu thập nằm trong phạm vi cha mẹ, để có được ý nghĩa về thứ bậc, nhưng không lồng các hành động thành viên. Nói cách khác, chỉ xây dựng các routes với lượng thông tin tối thiểu để xác định duy nhất resource, như thế này:
resources :articles do
  resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]
  • Ý tưởng này tạo ra sự cân bằng giữa các routes mô tả và deep nesting. Tồn tại cú pháp để đạt được điều đó, thông qua :shallow option:
resources :articles do
  resources :comments, shallow: true
end
  • Điều này sẽ tạo ra các routes chính xác giống như ví dụ đầu tiên. Bạn cũng có thể chỉ định tùy chọn :shallow trong resource gốc, trong trường hợp đó, tất cả các resources lồng nhau sẽ là shallow:
resources :articles, shallow: true do
  resources :comments
  resources :quotes
  resources :drafts
end
  • Phương thức shallow của DSL tạo ra một phạm vi bên trong mà mọi nesting đều là nông (shallow). Điều này tạo ra các routes giống như ví dụ trước:
shallow do
  resources :articles do
    resources :comments
    resources :quotes
    resources :drafts
  end
end
  • Có hai tùy chọn cho phạm vi để tùy chỉnh các shallow routes. :shallow_path tiền tố đường dẫn thành viên với tham số đã chỉ định:
scope shallow_path: "sekret" do
  resources :articles do
    resources :comments, shallow: true
  end
end
  • Comments resource ở đây sẽ có các routes sau:

  • Tùy chọn :shallow_prefix thêm các tham số đã chỉ định vào các trình trợ giúp route đã được đặt tên:
scope shallow_prefix: "sekret" do
  resources :articles do
    resources :comments, shallow: true
  end
end
  • Comments resource ở đây sẽ có các routes sau được tạo cho nó:

III. Kết luận


All Rights Reserved