Railsでルーティングが無いときの挙動を変える

挙動を変えたい場合がある

config/routes.rbに定義されていないパターンのパスを持つHTTPリクエストが来ると、Railsは非Production環境では例外を発生させ、Production環境では404用のレスポンスを返す。HTMLであればpublic/404.htmlを変更すれば幾つかの要求は満たせる。しかし、例えばJSONを返すAPIを提供したい場合、またレスポンスを動的に返したいような場合、任意の処理を実行可能にしたいという要求が生まれる。

全パターンに一致するルーティングを定義する

例えば GET /v1/users のように/v1以下をAPI用のパスに利用しており、/v1/foo などの定義されていないパスにリクエストが来たとき、適切な処理を実行させたいものとする。これは、matchを利用して全てのパターンに一致するようなルーティングを末尾に定義しておけば実現できる。

matchで全てのパターンに一致させるために、globを利用し(スラッシュを含む全ての文字列に一致させられる)、:viaオプションで全てのHTTPメソッドに一致するようにしている。また、通常はmatchではcontroller名とaction名を指定するが、単純な処理の場合は:toオプションでRackアプリを指定して済ますこともできる。

rb MyApp::Application.routes.draw do namespace :v1 do # ... match "*any", to: ->(env) { ... }, via: :all end end