特定のデータをページネーションで表示させるためにいろいろと調べたのでメモ
##いつもの
ページネーションの例に載っているような使い方だと
gem 'will_paginate', '3.1.6'
gem 'bootstrap-will_paginate', '1.0.0'
#=> bundle install実行
まずはGemfile
に追加した後コマンド実行。
コントローラでインスタンス変数.paginate
と追加。
def index
@words = Word.paginate(page: params[:page], per_page: 10)
end
wordsテーブルにあるすべてのデータをページネーションとして表示させるならあとはビューに
<%= will_paginate @words(@wordsはどっちでも可) %>
を置くだけで準備完了です。
##本題
条件を何も指定していないページネーションだとテーブルの全データ表示になるので、
per_page: 10
とか一ページにいくつ表示するかを指定しても、内部では全データを表示した前提での指定数を表示します。
###例
例によってwordsテーブルのcompleteカラムがtrueのページネーションとfalseのページネーションを作りたいと思います。
trueの値のデータが15個、falseの値のデータが10個あったとします。
def index #(trueのページネーションづくり)
@words = Word.paginate(page: params[:page], per_page: 10)
end
def practice #(falseのページネーションづくり)
@words = Word.paginate(page: params[:page], per_page: 10)
end
先ほどと同様のメソッド内容で実験。
仮にデータの値の順番(id:1~)
がt,f,t,f,t,f,...(t=true,f=false)
と交互だとすると、trueのページだと一ページ目には10個表示されるはずが5つしか表示されません。falseのページも同様の結果です。
これはWord.all
をページネーションするため変換したのがWord.pagenate
となっているからです(私調べ)。
trueのみが表示されるページでも内部では表示されないfalseの数も含まれているため、5つしか表示されなかったんですね。
メソッド内変更
def index #(trueのページネーションづくり)
@words = Word.paginate(page: params[:page], per_page: 10).where(complete: false)
end
def practice #(falseのページネーションづくり)
@answers = Word.paginate(page: params[:page], per_page: 10).where(complete: true)
end
これでtrueならtrueだけで数がカウントされます。falseも然り。