Ruby on Railsのバージョンを6から7に更新するにあたって躓いたところの覚書です。
もちろん「ほとんど手を加えずに動いた」なんて主張するつもりはありません。ですが、とにかく動作させてみれば、基本的にはRails(というかRuby)の親切設計で、エラーになった時に「ここは〇〇しないといけないよ」みたいなメッセージが出てきますので、それに従ってエラーに対処することでだいたい何とかなります。
ただし、一ヶ所落とし穴(それも結構深い、、、)にはまりました。
落とし穴
上に書いたようにRailsが表示するメッセージに従ってエラーに対処していくことで、ある程度Rails 7で表示できるようにはなりました。ですが、ページネーションをしているページを表示しようとすると以下のようなエラーになってしまいます。
ArgumentError in xxxxxx
(中略)
wrong number of arguments (given 4, expected 3)
で、その下には"<%= will_paginate %>"の行に赤く色が付いています。
ページネーション
ここを読むような方には説明は不要と思いますけど念のため。
例えばものすごく行の多い表を表示させるときに、そのまま全部表示しようとすると、スクロールバーが大変なことになるとか、そもそもページの表示に時間が掛かりすぎるとかいろいろ嬉しくありません。なので一ページ当たり何行、と分割して表示することになるでしょう。これをページネーション(pagination)と言います。
無駄なあがき - その1
エラーメッセージからはwill_paginateの引数が間違っているように思えます。それに「will_paginateの直後にはページネーションの対象になるものを明示的に指定すべきだ」みたいな発言がネットにあったりします。
なので、will_paginateに引数を指定してみました。
が、同じようにエラーになるだけではなく、エラーメッセージにすら変化はありませんでした。え、どういうこと?
無駄なあがき - その2
こうなったらGoogle先生にお伺いを立てるしかありません。"ArgumentError"とか"wrong number of arguments (given 4, expected 3)"さらには"Rails"とか"pagination"とかをいろいろ組み合わせて検索してみます。
そうすると、なんかそれっぽいのが出てくることは出てきます。が、よくよく見ると"(given 4, expected 3)"の数が違うとか、かなり以前(Rails 5とか)の話だったりします。「will_paginate 3.1.6のバグだから3.1.7以上に更新すればよい」なんてものもありましたが、手元のwill_paginateのバージョンは4.0.0、、、
となると、will_paginateとかもっと根本的なところから作り直さないといけない?
解決
上に書いたエラーの下に「Application Trace | Framework Trace | Full Trace」というのがあります。そのうちの"Framework Trace"または"Full Trace"を選んでみます。すると以下のようなものが表示されます。
bootstrap-will_paginate (1.0.0) config/initializers/will_paginate.rb:33:in `previous_or_next_page'
will_paginate (4.0.0) lib/will_paginate/view_helpers/link_renderer.rb:63:in `previous_page'
(初期状態(おそらく"Application Trace")だと、自分の書いたerbファイルでエラーの発生した行しか表示してくれません。)
どうやらwill_paginateが呼び出しているbootstrap-will_paginateに問題があるようです。
この線で調べていくと、bootstrap-will_paginateはBootstrapの3と4に対応しているけれども、どうやら最近のBootstrapは5らしい、ということが分かります。ということで、Bootstrap 5対応のbootstrap-will_paginate相当のgemを探しましょう、ということになります。で、will_paginate-bootstrap-styleがそれに該当します。
この辺り、色々なところに断片的には書かれているのですが、ズバッと言い切っているのは以下のページくらいですね。
以上より、Gemfileの
gem 'bootstrap-will_paginate'
を
gem 'will_paginate-bootstrap-style'
に書き換えて再挑戦です。
これでページネーションをしているページも問題なく表示できるようになりました。めでたし、めでたし。(表示が微妙に変わってしまっている可能性がありますが、漢(おとこ)なのでそういう細かいところは気にしません)
おことわり
恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。
また、今回「Bootstrap 5対応のbootstrap-will_paginate相当のgem」としてwill_paginate-bootstrap-styleを使ってますが、これが唯一の解なのか、最善の解なのかについては一切確認していません。手元で表示できて満足してしまったもので。