如果我們今天有 100 個品項,同時集中在一個頁面會讓這個頁面變得又臭又長
適當的拆成分頁就蠻重要的
Rails 有很多分頁的套件,我們今天會使用 pagy 來做
pagy 相較其他的分頁套件的樣式豐富,功能也豐富
gem 'pagy', '~> 6.0'
pagy 本身是個模組,為了使用它裡面的方法,我們必須要 include 進來
為什麼放在 application controller 呢?
有可能在其他頁面也會用到,所以我們就統一放在最上一層
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include Pagy::Backend
end
我們必須要將頁面呈現在畫面中,也會需要用到 pagy 的 方法,所以我們一樣把他 include 到 application helper 中
# app/helpers/application_helper.rb
module ApplicationHelper
include Pagy::Frontend
end
接下來我們就可以在 controller 中使用 pagy
pagy 方法後面的第一個參數是接資料,假設我們今天在飲品頁面要使用分頁,那麼參數就會是所有顯示出來的飲品資料
後面就可以針對你的需求來加其他參數
我們今天要讓他超過數量就換到下一頁,所以這邊就加上 items 並輸入幾個資料後要換頁
def index
@pagy, @drinks = pagy(Drink.all, items: 5)
end
最後我們在 view 中使用 pagy_nav 應該就會有分頁的樣子了
# app/views/drinks/index.html.erb
<%== pagy_nav(@pagy) %>
如果說今天很多頁面都會使用到 pagy ,或者有一些額外的功能需要設定,我們可以使用 pagy.rb
來做整理
# config/initializers/pagy.rb
Pagy::DEFAULT[:items] = 5
這時候就不需要在 controller 寫 items 的設定了
其他設定也是如此,詳情可參閱 pagy 的手冊
如果我們必須要加上 HTML 的屬性,例如 data-action 、 data-remote 等等,
我們可以使用 link_extra
來設定,設定的地方很彈性,在 controller 中、view 的 pagy 方法中、 pagy.rb 中都可以做設定
我們就在 controller 中設定好了
# app/controllers/drinks_controller.rb
def index
@pagy, @drinks = pagy(Drink.all, link_extra: 'data-remote="true"')
end
這麼一來他就會用 ajax 的方式換頁
需要注意的是, link_extra
是要加 HTML 可以使用的屬性,到時候會將這些屬性塞進 HTML 裡面
以上是簡單的 pagy 介紹