+1

Gem Pagy

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ặc kaminari

2. Install:

  • Thêm gem pagyvào Gemfile

    # Gemfile
    gem "pagy"
    
  • Chạy command để install gem

    bundle install
    
  • Thêm pagy.rb vào file config/initializer/pagy.rb

  • Bạn có thể tham khảo file mẫu tại đây

  • Thêm include Pagy::Frontend vào application_controller.rb

    # app/controllers/application_controller.rb
    class ApplicationController < ActionController::Base
      include Pagy::Backend
    end
    
  • Thêm include Pagy::Frontend vào application_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ới ActiveRecord_Relation được trả về bởi Book.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 file pagy.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 method pagy_t tương tự như method I18n.t
  • Method pagy_t nhanh hơn so với method I18n.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 option items để 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 option overflow để 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

Viblo
Let's register a Viblo Account to get more interesting posts.