1. Introduction:
- Gem
pagy
được sử dụng để paging trong Ruby on Rails - Gem
pagy
thể hiện nhiều ưu điểm hơn so với các gem khác nhưwill_paginate
hoặckaminari
2. Install:
Thêm gem
pagy
vàoGemfile
123<span class="token comment"># Gemfile</span>gem <span class="token string">"pagy"</span>Chạy command để install gem
12bundle installThêm
pagy.rb
vào fileconfig/initializer/pagy.rb
Bạn có thể tham khảo file mẫu tại đây
Thêm
include Pagy::Frontend
vàoapplication_controller.rb
12345<span class="token comment"># app/controllers/application_controller.rb</span><span class="token keyword">class</span> <span class="token class-name">ApplicationController</span> <span class="token operator"><</span> <span class="token constant">ActionController</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Base</span><span class="token keyword">include</span> <span class="token constant">Pagy</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Backend</span><span class="token keyword">end</span>Thêm
include Pagy::Frontend
vàoapplication_helper.rb
12345<span class="token comment"># app/helpers/application_helper.rb</span><span class="token keyword">module</span> <span class="token constant">ApplicationHelper</span><span class="token keyword">include</span> <span class="token constant">Pagy</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Frontend</span><span class="token keyword">end</span>
3. Basic Usage:
Sử dụng
pagy
method trong controller123<span class="token comment"># app/controller/books_controller.rb</span><span class="token variable">@pagy</span><span class="token punctuation">,</span> <span class="token variable">@books</span> <span class="token operator">=</span> pagy<span class="token punctuation">(</span><span class="token constant">Book</span><span class="token punctuation">.</span>all<span class="token punctuation">)</span>Thêm
require "pagy/extras/bootstrap"
vào pagy.rbSử dụng
pagy_bootstrap_nav
helper trong view123<span class="token comment"># app/views/books/index.html.erb</span><span class="token operator"><</span><span class="token string">%==</span> pagy_bootstrap_nav<span class="token punctuation">(</span><span class="token variable">@pagy</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token operator">></span>Kết quả thu được
4. Advance Usage:
a. Backend Extras:
Theo ví dụ trên, gem
pagy
đang thực hiện pagination vớiActiveRecord_Relation
được trả về bởiBook.all
.Tuy nhiên
pagy
cũng có thể thực hiện pagination với các kiểu dữ liệu khác có cấu trúc tương tự (dạng array).Để sử dụng chức năng này cần thêm các extra của gem
pagy
vào filepagy.rb
Ví dụ với cấu trúc kiểu Array
1234567<span class="token comment"># config/initializer/pagy.rb</span><span class="token keyword">require</span> <span class="token string">"pagy/extras/array"</span><span class="token comment"># app/controller/books_controller.rb</span><span class="token variable">@pagy</span><span class="token punctuation">,</span> <span class="token variable">@books</span> <span class="token operator">=</span> pagy_array<span class="token punctuation">(</span><span class="token constant">Book</span><span class="token punctuation">.</span>all<span class="token punctuation">)</span><span class="token variable">@pagy</span><span class="token punctuation">,</span> <span class="token variable">@books</span> <span class="token operator">=</span> pagy_array<span class="token punctuation">(</span><span class="token constant">Book</span><span class="token punctuation">.</span>all<span class="token punctuation">.</span>to_a<span class="token punctuation">)</span>Ta có thể thực hiện tương tự với Elasticsearch Rails, Searchkick
Tham khảo các backend extras khác tại đây
b. Frontend Extras:
- Gem
pagy
cung cấp các helper method để render pagination trên Front-end - Ví dụ123<span class="token comment"># app/views/books/index.html.erb</span><span class="token operator"><</span><span class="token string">%==</span> pagy_nav<span class="token punctuation">(</span><span class="token variable">@pagy</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token operator">></span>
- Gem
pagy
cung cấp các front extra và các helper method tương ứng tùy theo thư viện để render pagination trên Front-end - Ví dụ sử dụng bootstrap123456<span class="token comment"># config/initializer/pagy.rb</span><span class="token keyword">require</span> <span class="token string">"pagy/extras/bootstrap"</span><span class="token comment"># app/views/books/index.html.erb</span><span class="token operator"><</span><span class="token string">%==</span> pagy_bootstrap_nav<span class="token punctuation">(</span><span class="token variable">@pagy</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token operator">></span>
- Bạn có thể tham khảo template gốc của gen
pagy
và custom lại theo nhu cầu - Tham khảo template gốc của
pagy
cho bootstrap tại đây - Ví dụ123<span class="token comment"># app/views/books/index.html.erb</span><span class="token operator"><</span><span class="token string">%==</span> render partial<span class="token punctuation">:</span> <span class="token string">'pagy/bootstrap_nav'</span><span class="token punctuation">,</span> locals<span class="token punctuation">:</span> <span class="token punctuation">{</span>pagy<span class="token punctuation">:</span> <span class="token variable">@pagy</span><span class="token punctuation">}</span> <span class="token operator">%</span><span class="token operator">></span>
- Một số method của Pagy Object được sử dụng trong template1234567891011count<span class="token punctuation">:</span> tổng số recordpage<span class="token punctuation">:</span> page hiện tạiitems<span class="token punctuation">:</span> số lượng record của mỗi pagepages<span class="token punctuation">:</span> tổng số pagelast<span class="token punctuation">:</span> page cuối cùngoffset<span class="token punctuation">:</span>from<span class="token punctuation">:</span> index của record đầu tiên trong page <span class="token punctuation">(</span>tính từ <span class="token number">1</span><span class="token punctuation">)</span>to<span class="token punctuation">:</span> index của record cuối cùng trong page <span class="token punctuation">(</span>thường trùng với page<span class="token punctuation">.</span>items<span class="token punctuation">)</span>prev<span class="token punctuation">:</span> page trước<span class="token keyword">next</span><span class="token punctuation">:</span> page sau
- Tham khảo các front extras khác tại đây
c. Feature Extras:
i. I18n:
- Tham khảo các file i18n có sẵn tại đây
Pagy
cung cấp methodpagy_t
tương tự như methodI18n.t
- Method
pagy_t
nhanh hơn so với methodI18n.t
123456<span class="token comment"># config/initializer/pagy.rb</span><span class="token keyword">require</span> <span class="token string">"pagy/extras/i18n"</span><span class="token comment"># app/views/books/index.html.erb</span><span class="token operator"><</span><span class="token operator">%</span><span class="token operator">=</span> pagy_t<span class="token punctuation">(</span><span class="token string">"pagy.nav.prev"</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token operator">></span> - Tham khảo thêm tại đây
ii. items:
- Sử dụng method
pagy
với optionitems
để quy định số record trả về mỗi page - Ví dụ123456<span class="token comment"># config/initializer/pagy.rb</span><span class="token keyword">require</span> <span class="token string">"pagy/extras/items"</span><span class="token comment"># app/controller/books_controller.rb</span><span class="token variable">@pagy</span><span class="token punctuation">,</span> <span class="token variable">@books</span> <span class="token operator">=</span> pagy<span class="token punctuation">(</span><span class="token constant">Book</span><span class="token punctuation">.</span>all<span class="token punctuation">,</span> items<span class="token punctuation">:</span> <span class="token number">30</span><span class="token punctuation">)</span>
- Bạn có thể quy định số items mặc định trong
pagy.rb
1234<span class="token comment"># config/initializer/pagy.rb</span><span class="token constant">Pagy</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">VARS</span><span class="token punctuation">[</span><span class="token symbol">:items</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">20</span>
iii. overflow:
Sử dụng method
pagy
với optionoverflow
để quy định số behaviour trả về khi truy cập quá số page cho phépVí dụ
123456<span class="token comment"># config/initializer/pagy.rb</span><span class="token keyword">require</span> <span class="token string">"pagy/extras/overflow"</span><span class="token comment"># app/controller/books_controller.rb</span><span class="token variable">@pagy</span><span class="token punctuation">,</span> <span class="token variable">@books</span> <span class="token operator">=</span> pagy<span class="token punctuation">(</span><span class="token constant">Book</span><span class="token punctuation">.</span>all<span class="token punctuation">,</span> overflow<span class="token punctuation">:</span> exception<span class="token punctuation">)</span>Bạn có thể quy định số items mặc định trong
pagy.rb
1234<span class="token comment"># config/initializer/pagy.rb</span><span class="token constant">Pagy</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">VARS</span><span class="token punctuation">[</span><span class="token symbol">:overflow</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token symbol">:exception</span>Các options có thể là
1234empty_page<span class="token punctuation">:</span> trả về mảng rỗng cho paginglast_page<span class="token punctuation">:</span> trả về record của page cuối cùng cho pagingexception<span class="token punctuation">:</span> <span class="token keyword">raise</span> <span class="token constant">Pagy</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">OverflowError</span>Tham khảo các feature extra khác tại đây