Open6

Rails で ActionController::RoutingError をハンドリングするならどう実装するのがいいのか

北山淳也北山淳也

Rails のデフォルト挙動では routes.rb で定義してないエンドポイントにアクセスすると ActionController::RoutingError 例外が raise される

開発中はまあ別にいいんだが、
本番環境において例外発生をアラートするような仕組みにしていた場合
邪魔だから例外にしたくないとか、監視の方針によっていい感じにハンドリングしたいことがあると思う。

ベストっぽい手法はネット上に転がってるのでまとめて「私はこういう理由でこうハンドリングする」という記事を投稿したいが、ちと今は時間が取れないので
ひとまずネット上に転がってる記事をまとめておく

北山淳也北山淳也

2014の超古い情報だが、
kaminari の maintainer である Yuki Nishijima さんが書いてるのをやっとくのが結局よさげ。
(単独記事じゃなくて別記事へのコメントってカタチなので見つけにくい気がするが…)
https://qiita.com/mr-myself/items/c2f4fb2e5dcee6a336f3#comment-23298b703d75b7d27487


もう少し詳しい話は、以下記事あたりが参考になる

北山淳也北山淳也

match が非推奨云々は Rails v7.1 現在も Rails ガイドに match メソッドの記述があるので
match が非推奨というかワイルドカードセイグメント+match が非推奨な感じ?
Rails のコード内コメントで deprecated みたいな記述を見た気がするが、どこだったか、、、

https://railsguides.jp/routing.html#http-verbを制限する

北山淳也北山淳也

一方で、Google検索すると一番出てくる方法が
Yuki Nishijima さんがやめといた方がいいじゃないかって言ってる matchのワイルドカードセグメントでエラーにしないようにしちゃう方法。
やめといた方がいい理由は前述の Yuki Nishijima さんのQiitaコメントにもあるが個人的には

get なので、他の HTTP Method のリクエストに対応不能

ってのが一番納得感のある理由。
じゃあ match... via: :all で対応できるじゃん!ってのもあるので
まあこの方法でも ActionController::RoutingError をエラーにしたくないっていう目的自体は達成できることも少なくないんだろう。

この記事の人も似たようなこと言ってる。

https://qiita.com/gaaamii/items/183a9a3091a1751d833a


で、それはどうするのかっていうとこの辺のやり方。

https://qiita.com/itoytr/items/fb1ea251197003deec12

https://qiita.com/paranishian/items/36a70bd8f87137872ffe

https://stackoverflow.com/questions/11731028/rails-wildcard-routes-vs

https://stackoverflow.com/questions/32335023/rails-routing-wildcard

北山淳也北山淳也

今のところはこんな感じ。記事にしたらcloseする。
何か2024以降の最新情報持ってる人がいたら追加で投稿してください。