Tính năng resources
trong routes
là rất hữu ích, nhưng khi bắt đầu với RoR, một số tính năng được xây dựng trên nó có thể khiến bạn khó mà tự giải thích được.
Bài viết sẽ giúp bạn hiểu và có thể sử dụng routes một cách hiệu quả!
basic information about resources
Resources
giúp bạn viết một cách ngắn gọn hơn nhưng mô tả một cách đầy đủ các route cơ bản trong ứng dụng của bạn. Khi bạn xác định một resources route
, nó sẽ tạo các route cho tất cả các action CRUD cho bạn theo quy ước rails (rails conventions).
resource
and resources
Sự khác biệt rõ ràng đầu tiên giữa resources và resource là s, có nghĩa là resource
là số nhiều (plural) hoặc số ít (singular).
Routes được tạo ra với resources
: gồm 7 routes
Prefix | Verb | URI Pattern | Controller#action |
---|---|---|---|
users | GET | /users(.:format) | users#index |
POST | /users(.:format) | users#create | |
new_user | GET | /users/new(.:format) | users#new |
edit_user | GET | /users/:id/(.:format) | users#edit |
user | GET | /users/:id/(.:format) | users#show |
PUT/ PATCH | /users/:id/(.:format) | users#update | |
DELETE | /users/:id/(.:format) | users#destroy |
Trong khi đó, Routes được tạo ra với resource
là :
Prefix | Verb | URI Pattern | Controller#action |
---|---|---|---|
new_users | GET | /users/new(.:format) | users#new |
edit_users | GET | /users/(.:format) | users#edit |
users | GET | /users/(.:format) | users#show |
PUT/ PATCH | /users/(.:format) | users#update | |
DELETE | /users/(.:format) | users#destroy | |
POST | /users(.:format) | users#create |
Như bạn thấy không có ID trong các route pattens khi sử dụng resource
và resource
không tạo ra bất kỳ route nào mà được xử lý với action index.
Vậy khi nào thì sử dụng resource
?
Ez! Đôi khi, bạn tra cứu mà không cần tham chiếu đến ID. Ví dụ: bạn muốn /profile
luôn hiển thị profile của người dùng hiện đang đăng nhập. Trong trường hợp này, bạn có thể sử dụng singular resource để ánh xạ /profile
(thay vì /profile/: id
) với action show
.
Hoặc ví dụ khác, một user thường thuộc 1 organization duy nhất, do đó để xem profile của organization đó, ta có thể có 2 routes:
/organizations/:id
/organization
#simply
Ở đây, việc triển khai route theo cách thứ 2 có ý nghĩa hơn, đúng không nhỉ? Bạn lấy đối tượng organization từ association với user:
1 2 3 | #<span class="token keyword">in</span> organizations#show @organization <span class="token operator">=</span> current_user<span class="token punctuation">.</span>organization |
only
and except
Nếu bạn muốn chỉ có các route cụ thể của resource(s) route , bạn có thể thêm các exceptions trong “only” hoặc “except”
1 2 3 4 5 | Rails<span class="token punctuation">.</span>application<span class="token punctuation">.</span>routes<span class="token punctuation">.</span>draw <span class="token keyword">do</span> resources <span class="token operator">:</span>users<span class="token punctuation">,</span> only<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token operator">:</span>index<span class="token punctuation">]</span> resources <span class="token operator">:</span>customers<span class="token punctuation">,</span> except<span class="token operator">:</span> <span class="token punctuation">[</span><span class="token operator">:</span>create<span class="token punctuation">,</span> <span class="token operator">:</span>show<span class="token punctuation">,</span> <span class="token operator">:</span>update<span class="token punctuation">,</span> <span class="token operator">:</span>destroy<span class="token punctuation">]</span> end |
Generated Routes sẽ là :
1 2 3 4 5 6 | # Prefix Verb <span class="token constant">URI</span> Pattern Controller#Action # users <span class="token constant">GET</span> <span class="token operator">/</span><span class="token function">users</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> users#index # customers <span class="token constant">GET</span> <span class="token operator">/</span><span class="token function">customers</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> customers#index # new_customer <span class="token constant">GET</span> <span class="token operator">/</span>customers<span class="token operator">/</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> customers#<span class="token keyword">new</span> # edit_customer <span class="token constant">GET</span> <span class="token operator">/</span>customers<span class="token operator">/</span><span class="token operator">:</span>id<span class="token operator">/</span><span class="token function">edit</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> customers#edit |
collection
route?
Bằng cách sử dụng collection, bạn có thể thêm các routes bổ sung vào controller. Bạn chỉ cần tạo một collection route mới và xác định một phương thức có cùng tên với method trong controller. như bạn thấy cả hai cách tạo COLLECTION đều hoạt động:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Rails<span class="token punctuation">.</span>application<span class="token punctuation">.</span>routes<span class="token punctuation">.</span>draw <span class="token keyword">do</span> resources <span class="token operator">:</span>users <span class="token keyword">do</span> collection <span class="token keyword">do</span> <span class="token keyword">get</span> <span class="token operator">:</span>some_collection end <span class="token keyword">get</span> <span class="token operator">:</span>another_collection<span class="token punctuation">,</span> collection<span class="token operator">:</span> <span class="token boolean">true</span> end end # Generated Routes # Prefix Verb <span class="token constant">URI</span> Pattern Controller#Action # some_collection_users <span class="token constant">GET</span> <span class="token operator">/</span>users<span class="token operator">/</span><span class="token function">some_collection</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> users#some_collection # another_collection_users <span class="token constant">GET</span> <span class="token operator">/</span>users<span class="token operator">/</span><span class="token function">another_collection</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> users#another_collection |
member
in route?
member
giống như collection
nhưng chúng có một id trong route được tạo, có nghĩa là route này thuộc về một thành viên của resource
Và cũng có hai cách tạo MEMBER:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Rails<span class="token punctuation">.</span>application<span class="token punctuation">.</span>routes<span class="token punctuation">.</span>draw <span class="token keyword">do</span> resources <span class="token operator">:</span>users <span class="token keyword">do</span> member <span class="token keyword">do</span> <span class="token keyword">get</span> <span class="token operator">:</span>some_member end <span class="token keyword">get</span> <span class="token operator">:</span>another_member<span class="token punctuation">,</span> on<span class="token operator">:</span> <span class="token operator">:</span>member end end # Generated Routes # Prefix Verb <span class="token constant">URI</span> Pattern Controller#Action # some_member_user <span class="token constant">GET</span> <span class="token operator">/</span>users<span class="token operator">/</span><span class="token operator">:</span>id<span class="token operator">/</span><span class="token function">some_member</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> users#some_member # another_member_user <span class="token constant">GET</span> <span class="token operator">/</span>users<span class="token operator">/</span><span class="token operator">:</span>id<span class="token operator">/</span><span class="token function">another_member</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token operator">:</span>format<span class="token punctuation">)</span> users#another_member |
Alright! Bằng cách sử dụng các phương pháp này, code của bạn sẽ clean và dễ đọc hơn.
Hẹn gặp lại ở post tiếp theo !