Những kĩ thuật routing trong Rails
Bài đăng này đã không được cập nhật trong 4 năm
Routing là kĩ thuật điều hướng thông qua các URL được gửi lên từ trình duyệt đến các action trong Controller. Routes chính là cầu nối giao tiếp chính khi người dùng thao tác với website. Chính vì vậy mà việc routing rất quan trọng, tạo ra các URL thân thiện, tường minh với người dùng nhưng vẫn đáp ứng đủ yêu cầu về mặt kĩ thuật về phía server. Routing xuất hiện ở hầu hết các framework phổ biến. Ở bài viết này tôi sẽ giới thiệu với mọi người về các kĩ thuật Routing trong Rails.
-
Resources
Resources sẽ tạo ra 7 routes mặc định ánh xạ đến 7 action trong controller: [ :index, :new, :create, :show, :edit, :update, :destroy] Ví dụ khi bạn muốn tạo routes cho đối tượng user
#config/routes.rb
resources :user
Để kiểm tra các routes đang có trong project, chúng ta gõ lệnh rails routes, trong trường hợp trên, 7 routes được tạo ra sẽ có dạng: Trong đó: * Prefix: là đường dẫn rút gọn thay cho cách viết như URI * Verb: là method HTTP ứng với mỗi route * URI: là đường dẫn ứng trên thanh URL của website * Controller#Action: là Action được thực thi khi mà route được gọi
-
Nested Resources
Nested Resources dùng để phản ánh mối quan hệ 1-n giữa các model trong routes và thể hiện qua URLs, ví dụ như một Room có nhiều Report và một Report phải thuộc về một Room thì Rails cho phép thiết lập các tài nguyên lồng nhau. Việc thiết lập Nested Resources sẽ giúp quản lý tài nguyên tốt hơn, khoa học hơn. Cách viết:
#config/routes.rb
resources :rooms do
resources :report
end
Khi chạy rails routes: Nếu viết như trên thì sẽ tạo ra tất cả 14 routes chia đều cho room và report. Để ý URI Pattern của report thì có thể thấy chúng đều gắn với room.
-
Resource
Resource sẽ chỉ tạo ra 6 routes, không có index. Ngoài ra khi Resource các routes sẽ không sử dụng đến :id.
#config/routes.rb
resource :rooms
Khi chạy rails routes:
-
Namespace
Namespace giúp phân nhóm, tạo ra tiền tố để dễ phân biệt và quản lý routes. Ví dụ chúng ta muốn phân biệt các routes của admin
#config/routes.rb
namespace :admins do
resources :rooms
end
Khi rails routes: Các routes đã có thêm tiền tố admin.
-
collection và member
Cả 2 options trên đều được dùng trong resources để tạo routes ánh xạ tới các method không phải mặc định(:index, :new,...) trong controller. Điểm khác nhau là collection không sử dụng id từ resources chứa nó. Cách viết:
#config/routes.rb
resources :rooms do
collection do
get :search
end
end
Còn member có sử dụng id từ resources chứa nó. Ở ví dụ này là id của room.
#config/routes.rb
resources :rooms do
member do
get :search
end
end
-
only: , except:
Nếu không muốn tạo ra cả 7 routes như mặc định của resources thì có thể sử dụng: only: chỉ lấy các routes đã chỉ định except: bỏ qua các routes đã chỉ định Quay lại ví dụ resources :user nếu chỉ muốn tạo ra 2 routes [:index, :new] thì chúng ta sử dụng only như sau:
#config/routes.rb
resources :user, only: [:index, :new]
Sẽ có 2 routes được tạo ra là :index và :new.
Ngược lại khi không muốn tạo các routes [:index, :new], thì chúng ta thay only thành except :
#config/routes.rb
resources :user, only: [:index, :new]
Sẽ có 5 routes được tạo ra ngoại trừ :index và :new
-
Lời kết
Bài viết này mình có tham khảo tại: https://guides.rubyonrails.org/routing.html Cảm ơn mọi người đã đọc ^^
All rights reserved