【Ruby on Rails】Sử dụng tùy chọn shallow trong file routes

Ruby on Rails

Updated by Yuto Yasunaga at 2020/12/13 17:31

Khi sử dụng nest resources, khai báo tùy chọn shallow trong routes sẽ làm các URL ngắn gọn dễ nhìn hơn.

Giả sử một application có model Category, mỗi Category bao gồm nhiều Article. Trong trường hợp này thì thường khai báo resources là:

resources :categories do
  resources :articles
end

Lúc này URL để tạo Article mới sẽ là /categories/:category_id/articles/new
Tuy nhiên nếu như vậy, thì sau khi tạo Article xong và vào action #show của Article này, thì URL sẽ trở thành /categories/:category_id/articles/:id
Có vẻ hơi dư thừa, chỉ cần /articles/:id thôi cũng được rồi

Do đó, khai báo thêm tùy chọn shallow

resources :categories, shallow: true do
  resources :articles
end

Lúc này routes sẽ là:

        category_articles GET    /categories/:category_id/articles(.:format)                                              articles#index
                          POST   /categories/:category_id/articles(.:format)                                              articles#create
     new_category_article GET    /categories/:category_id/articles/new(.:format)                                          articles#new
             edit_article GET    /articles/:id/edit(.:format)                                                             articles#edit
                  article GET    /articles/:id(.:format)                                                                  articles#show
                          PATCH  /articles/:id(.:format)                                                                  articles#update
                          PUT    /articles/:id(.:format)                                                                  articles#update
                          DELETE /articles/:id(.:format)                                                                  articles#destroy
               categories GET    /categories(.:format)                                                                    categories#index
                          POST   /categories(.:format)                                                                    categories#create
             new_category GET    /categories/new(.:format)                                                                categories#new
            edit_category GET    /categories/:id/edit(.:format)                                                           categories#edit
                 category GET    /categories/:id(.:format)                                                                categories#show
                          PATCH  /categories/:id(.:format)                                                                categories#update
                          PUT    /categories/:id(.:format)                                                                categories#update
                          DELETE /categories/:id(.:format)                                                                categories#destroy

Ở 3 action #index, #new, #create, thì chưa có chỉ định article_id, do đó category_id thì cần thiết, ngoài 3 action đó ra thì chỉ cần chỉ định article_id thôi là được rồi.

Trong trường hợp thêm các action:

config/routes.rb
resources :categories, shallow: true do
  resources :articles do
    get :search, on: :collection
    post :like, on: :member
  end
end

Lúc này thì:

 search_category_articles GET    /categories/:category_id/articles/search(.:format)                                       articles#search
             like_article POST   /articles/:id/like(.:format)                                                             articles#like

Như chúng ta thấy ở trên, chỉ những action nào chưa có chỉ định article_id thì mới cần thiết đến category_id.

Đối với trường hợp nest resources 2 cấp, thì cũng chỉ cần tùy chọn 1 lần shallow: true thôi là đủ.

resources :categories, shallow: true do
  resources :articles do
    get :search, on: :collection
    post :like, on: :member
    resources :comments
  end
end

Lúc này thì comments#new sẽ là /articles/:article_id/comments/new, comments#show sẽ là /comments/:id


Back