Gem Pagy
This post hasn't been updated for 3 years
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
# Gemfile gem "pagy"
-
Chạy command để install gem
bundle 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
# app/controllers/application_controller.rb class ApplicationController < ActionController::Base include Pagy::Backend end
-
Thêm
include Pagy::Frontend
vàoapplication_helper.rb
# app/helpers/application_helper.rb module ApplicationHelper include Pagy::Frontend end
3. Basic Usage:
-
Sử dụng
pagy
method 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_nav
helper 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
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
# 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
pagy
cung cấp các helper method để render pagination trên Front-end - Ví dụ
# app/views/books/index.html.erb <%== pagy_nav(@pagy) %>
- 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
# 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
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ụ
# 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
Pagy
cung cấp methodpagy_t
tương tự như methodI18n.t
- Method
pagy_t
nhanh 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
pagy
vớ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
pagy
vớ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