エラーの原因は単純ですが、pagyを用いる際にエラーが起きて手間取ったので、備忘録がてら書いていきます。
やりたいこと
kaminariでページネーション機能をつけていたのを、仕様はそのままでpagyに変更したい。
起きたエラーと解決法
def timeline
@feed_items = current_user.feed
@pagy, @feed_items = pagy(@feed_items) if @feed_items.present?
@user = User.find_by(params[:user_id])
end
↓
エラー
NoMethodError in UsersController#timeline
undefined method `offset' for [#<ListMovie id・・・
エラーメッセージによれば、undefined method 'offset'
は、@feed_items
がoffset
メソッドを持っていないことを示しています。offset
はActiveRecordのメソッドで、通常はデータベースからのレコードセットに対して使用されます。しかし、@feed_items
は配列なのでエラーになっています。
これを解決するにはpagy_array
を使用して@feed_items
をページネートする必要があるので、以下のように修正します。
def timeline
@feed_items = current_user.feed.to_a
@pagy, @feed_items = pagy_array(@feed_items) if @feed_items.present?
@user = User.find_by(params[:user_id])
end
上記ではto_a
メソッドを使用して@feed_items
を配列に変換し、その後pagy_array
を使用して配列をページネートしています。
↓
またもやエラー
NoMethodError in UsersController#timeline
undefined method `pagy_array' for
pagy_array
が未定義とのこと。
今回の原因はPagyのArrayサポートが有効になっていないためでした。Pagy::Backend
モジュールはpagy_array
メソッドを提供しますが、そのためにはPagy::Array
モジュールが必要です。
下記のコードを追記して、pagy.rbでPagyのArrayサポートを有効にします。
require 'pagy/extras/array'
この変更を加えた後、サーバーを再起動して変更を有効にする必要があります。
これにより、Pagy gemは配列に対するページネーションをサポートするようになる。
→ pagy_arrayというメソッドが利用可能になります!