1
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 3 years have passed since last update.

will_paginateのwindowオプションの実装が間違ってる?

Last updated at Posted at 2020-03-03

はじめに

Railsでページング機能を実装するgemはいくつかありますが、自分はwill_pagenateを使ってます。そのオプションが意図通りに機能せず、実装が間違ってるのかなと思ったんですが、結論としては合ってそうだという話です。

#事象
will_pagenateでは、Viewに表示するページリンク範囲のオプションがあります。

outer_window:最初と最後のページの後(前)に表示するページ数
inner_window:表示しているページの前後に表示するページ数

自分はouter_windowを0、inner_windowを1に設定していました。
それなので、挙動は以下の画像のようになります。

スクリーンショット 2020-03-03 16.39.12.png outer_windowは0なので、2ページと16ページは表示されません。 inner_windowは1なので、現在のページである5ページの前後である、4ページと6ページが表示されます。 想定通りの動作です。

しかし4ページを選択すると以下の様な挙動となりました。
スクリーンショット 2020-03-03 16.43.51.png

outer_windowは0なので、2ページは表示しません。
また現在のページも4ページなので、一つ前の3ページまでしか表示されず、2ページは「…」で省略されるはずです。
それにも関わらずに2ページが表示されています。
#コード
will_pagenateのコードを見てみましょう。
GitHubでview_helper周りのコードを確認してみると、以下の様な記述がありました。

view_helpers/link_renderer_base.rb
# 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と同じ挙動でした。標準的な動作のようですね。

1
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
1
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?