3
1

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 1 year has passed since last update.

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とかもっと根本的なところから作り直さないといけない?:scream::scream::scream:

解決

上に書いたエラーの下に「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'

に書き換えて再挑戦です。

これでページネーションをしているページも問題なく表示できるようになりました。めでたし、めでたし。(表示が微妙に変わってしまっている可能性がありますが、漢(おとこ)なのでそういう細かいところは気にしません:sweat_smile:

おことわり

恒例のお断りですが、この文章の内容は、筆者が所属している会社・団体とは一切関わりがありません。いわゆる「自主的な研究の成果の発表」というものです。

また、今回「Bootstrap 5対応のbootstrap-will_paginate相当のgem」としてwill_paginate-bootstrap-styleを使ってますが、これが唯一の解なのか、最善の解なのかについては一切確認していません。手元で表示できて満足してしまったもので。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?