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アプリを指定して済ますこともできる。
MyApp::Application.routes.draw do
namespace :v1 do
# ...
match "*any", to: ->(env) { ... }, via: :all
end
end