Gem Pagy
Bài đăng này đã không được cập nhật trong 5 năm
1. Introduction:
- Gem
pagyđược sử dụng để paging trong Ruby on Rails - Gem
pagythể hiện nhiều ưu điểm hơn so với các gem khác nhưwill_paginatehoặckaminari
2. Install:
-
Thêm gem
pagyvàoGemfile# Gemfile gem "pagy" -
Chạy command để install gem
bundle install -
Thêm
pagy.rbvào fileconfig/initializer/pagy.rb -
Bạn có thể tham khảo file mẫu tại đây
-
Thêm
include Pagy::Frontendvàoapplication_controller.rb# app/controllers/application_controller.rb class ApplicationController < ActionController::Base include Pagy::Backend end -
Thêm
include Pagy::Frontendvàoapplication_helper.rb# app/helpers/application_helper.rb module ApplicationHelper include Pagy::Frontend end
3. Basic Usage:
-
Sử dụng
pagymethod trong controller# app/controller/books_controller.rb @pagy, @books = pagy(Book.all) -
Thêm
require "pagy/extras/bootstrap"vào pagy.rb -
Sử dụng
pagy_bootstrap_navhelper trong view# app/views/books/index.html.erb <%== pagy_bootstrap_nav(@pagy) %> -
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
pagycũ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
pagyvào filepagy.rb -
Ví dụ với cấu trúc kiểu Array
# config/initializer/pagy.rb require "pagy/extras/array" # app/controller/books_controller.rb @pagy, @books = pagy_array(Book.all) @pagy, @books = pagy_array(Book.all.to_a) -
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
pagycung cấp các helper method để render pagination trên Front-end - Ví dụ
# app/views/books/index.html.erb <%== pagy_nav(@pagy) %> - Gem
pagycung 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
# config/initializer/pagy.rb require "pagy/extras/bootstrap" # app/views/books/index.html.erb <%== pagy_bootstrap_nav(@pagy) %> - Bạn có thể tham khảo template gốc của gen
pagyvà custom lại theo nhu cầu - Tham khảo template gốc của
pagycho bootstrap tại đây - Ví dụ
# app/views/books/index.html.erb <%== render partial: 'pagy/bootstrap_nav', locals: {pagy: @pagy} %> - Một số method của Pagy Object được sử dụng trong template
count: tổng số record page: page hiện tại items: số lượng record của mỗi page pages: tổng số page last: page cuối cùng offset: from: index của record đầu tiên trong page (tính từ 1) to: index của record cuối cùng trong page (thường trùng với page.items) prev: page trước next: 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
Pagycung cấp methodpagy_ttương tự như methodI18n.t- Method
pagy_tnhanh hơn so với methodI18n.t# config/initializer/pagy.rb require "pagy/extras/i18n" # app/views/books/index.html.erb <%= pagy_t("pagy.nav.prev") %> - Tham khảo thêm tại đây
ii. items:
- Sử dụng method
pagyvới optionitemsđể quy định số record trả về mỗi page - Ví dụ
# config/initializer/pagy.rb require "pagy/extras/items" # app/controller/books_controller.rb @pagy, @books = pagy(Book.all, items: 30) - Bạn có thể quy định số items mặc định trong
pagy.rb# config/initializer/pagy.rb Pagy::VARS[:items] = 20
iii. overflow:
-
Sử dụng method
pagyvới optionoverflowđể quy định số behaviour trả về khi truy cập quá số page cho phép -
Ví dụ
# config/initializer/pagy.rb require "pagy/extras/overflow" # app/controller/books_controller.rb @pagy, @books = pagy(Book.all, overflow: exception) -
Bạn có thể quy định số items mặc định trong
pagy.rb# config/initializer/pagy.rb Pagy::VARS[:overflow] = :exception -
Các options có thể là
empty_page: trả về mảng rỗng cho paging last_page: trả về record của page cuối cùng cho paging exception: raise Pagy::OverflowError -
Tham khảo các feature extra khác tại đây
5. Link demo
All rights reserved
