0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ページネーション機能をkaminari→pagyに変更したときに起きたエラー

Posted at

エラーの原因は単純ですが、pagyを用いる際にエラーが起きて手間取ったので、備忘録がてら書いていきます。

やりたいこと

kaminariでページネーション機能をつけていたのを、仕様はそのままでpagyに変更したい。

起きたエラーと解決法

users_controller.rb
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_itemsoffsetメソッドを持っていないことを示しています。offsetはActiveRecordのメソッドで、通常はデータベースからのレコードセットに対して使用されます。しかし、@feed_itemsは配列なのでエラーになっています。

これを解決するにはpagy_arrayを使用して@feed_itemsをページネートする必要があるので、以下のように修正します。

users_controller.rb
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サポートを有効にします。

config/initializers/pagy.rb
require 'pagy/extras/array'

この変更を加えた後、サーバーを再起動して変更を有効にする必要があります。

これにより、Pagy gemは配列に対するページネーションをサポートするようになる。
→ pagy_arrayというメソッドが利用可能になります!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?