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 install -
Thê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.rb -
Sử 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 bootstrap
123456<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 template
1234567891011count<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ép -
Ví 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