はじめに
Railsでページング機能を実装するgemはいくつかありますが、自分はwill_pagenateを使ってます。そのオプションが意図通りに機能せず、実装が間違ってるのかなと思ったんですが、結論としては合ってそうだという話です。
#事象
will_pagenateでは、Viewに表示するページリンク範囲のオプションがあります。
outer_window:最初と最後のページの後(前)に表示するページ数
inner_window:表示しているページの前後に表示するページ数
自分はouter_windowを0、inner_windowを1に設定していました。
それなので、挙動は以下の画像のようになります。
outer_windowは0なので、2ページは表示しません。
また現在のページも4ページなので、一つ前の3ページまでしか表示されず、2ページは「…」で省略されるはずです。
それにも関わらずに2ページが表示されています。
#コード
will_pagenateのコードを見てみましょう。
GitHubでview_helper周りのコードを確認してみると、以下の様な記述がありました。
# left window
if outer_window + 3 < middle.first # there's a gap
left = (1..(outer_window + 1)).to_a
left << :gap
else # runs into visible pages
left = 1...middle.first
end
ページの表示をleft、middle、rightに分けている様です。
必要であればleftとmiddleの間にgap(「...」のこと)を挿入します。
このコードは、outer_windowに+3した数字が、middleの最初のページより小さい場合は、gapを挿入すると書いてあります。
今回は4ページを選択しているので、middleの最初のページは4-1=3、outer_window+3=3となり、gapを挿入する条件を満たしません。
それゆえ2ページ含め全て表示されてしまいます。
#理由
このケースで表示を「...」としても1件(2ページ目)しか表示を省略できません。
ということをどちらにせよ1文字分のスペースは占有するということです。
それであれば、なんの機能も持たない「...」を表示させるより、ページリンクを表示した方がユーザーの役に立ちますよね。
ということで2ページ以上省略できない場合は、そのままページリンクを表示させていると思われます。
#おわりに
ちなみに他のページングgem(kaminari,pagy)を使ってみたんですが、will_pagenateと同じ挙動でした。標準的な動作のようですね。