Rails で ActionController::RoutingError をハンドリングするならどう実装するのがいいのか
Rails のデフォルト挙動では routes.rb で定義してないエンドポイントにアクセスすると ActionController::RoutingError
例外が raise される
開発中はまあ別にいいんだが、
本番環境において例外発生をアラートするような仕組みにしていた場合
邪魔だから例外にしたくないとか、監視の方針によっていい感じにハンドリングしたいことがあると思う。
ベストっぽい手法はネット上に転がってるのでまとめて「私はこういう理由でこうハンドリングする」という記事を投稿したいが、ちと今は時間が取れないので
ひとまずネット上に転がってる記事をまとめておく
2014の超古い情報だが、
kaminari の maintainer である Yuki Nishijima さんが書いてるのをやっとくのが結局よさげ。
(単独記事じゃなくて別記事へのコメントってカタチなので見つけにくい気がするが…)
もう少し詳しい話は、以下記事あたりが参考になる
- Railsアプリの例外ハンドリングとエラーページの表示についてまとめてみた | Qiita
- Rails の exceptions_app によるエラーページの表示をテストする | Qiita
- Railsのミドルウェアのエラーハンドリング | freedom-man
match が非推奨云々は Rails v7.1 現在も Rails ガイドに match メソッドの記述があるので
match が非推奨というかワイルドカードセイグメント+match が非推奨な感じ?
Rails のコード内コメントで deprecated みたいな記述を見た気がするが、どこだったか、、、
一方で、Google検索すると一番出てくる方法が
Yuki Nishijima さんがやめといた方がいいじゃないかって言ってる matchのワイルドカードセグメントでエラーにしないようにしちゃう方法。
やめといた方がいい理由は前述の Yuki Nishijima さんのQiitaコメントにもあるが個人的には
get なので、他の HTTP Method のリクエストに対応不能
ってのが一番納得感のある理由。
じゃあ match... via: :all
で対応できるじゃん!ってのもあるので
まあこの方法でも ActionController::RoutingError をエラーにしたくないっていう目的自体は達成できることも少なくないんだろう。
この記事の人も似たようなこと言ってる。
で、それはどうするのかっていうとこの辺のやり方。
同じ話は lograge の以下 ISSUE でもこうするのがいいんじゃないか、いやこうする方がみたいな議論がなされている
今のところはこんな感じ。記事にしたらcloseする。
何か2024以降の最新情報持ってる人がいたら追加で投稿してください。