kaminariでundefined method `page' for #<Array:0x000xxxxxx>と出た
Kaminariを使用したページネーションを作ろうとしており、通常通り実装していたら、以下のようなエラーが出てしまいました。。。
NoMethodError - undefined method `page' for #<Array:0x000xxxxxx>
kaminariの使い方は間違っていないはず!何故?!と思い調べてみたら無事解決できたのでその手順を書き留めておきます。
エラー内容
コントローラでは、以下のように、whereでデータを取得した後、モデルのスコープを使用しておりました。
そこにつなげて、page(params[:page]).per(10) と記述しておりました。
controller
def index
略
@hoges = Hoge.where( 略 ).hoge_method.page(params[:page]).per(10)
略
end
モデルのスコープは以下のように、selectを使ってデータを取得しておりました。
model
scope :hoge_method, -> { select { |hoge| hoge.hogerable? } }
ビューは通常通り、kaminariのヘルパーを用いておりました。
view
= paginate @hoges
しかし、以下のようなエラーが出てしまっておりました。。。
NoMethodError - undefined method `page' for #<Array:0x000xxxxxx>
解決法
きちんとkaminariのReadmeを読んだら書いてありました!!
通常、ActiveRecordのオブジェクトに対して.pageメソッドを使用できるのですが、今回の場合はActiveRecordのオブジェクトではなく、Arrayだったのでエラーが出ていたようです!
そして、Arrayに対しては、以下のようにしてやるとページネーションが実装できるとReadmeに書いてありました!
@paginatable_array = Kaminari .paginate_array(my_array_object).page(params[:page]).per(10)
なのでReadmeのやり方に従って、コントローラを書き直してあげます。
def index
略
@hoges = Hoge.where( 略 ).hoge_method
@hoges = Kaminari.paginate_array(@hoges).page(params[:page]).per(10)
略
end
これで無事にページネーションが機能してくれました!!
原因
モデルのスコープで、select { |hoge| hoge.hogerable? } としていた部分で、ActiveRecordのオブジェクトからArrayに変わっていたのが原因のようでした!
感想その他
知っていたり、検索するのが上手ければすぐ解決できたのかもしれませんが、自結構苦戦しました。。。
それと、コード例の部分で初めてhogeというワードを自ら使ってみましたw
hogeとかfugaとか、コードをそのまま書けないときに便利なのでこれからも使っていこうと思います。
hogehugaは英語なのかな?