RailsGuidesにちゃんと書いてありますが、ちょっとハマりました。
こういうのはダメ。
Rails.application.routes.draw do
constraints subdomain: :api do
scope module: :api do
namespace :v1, format: :json do
resources :posts
end
end
end
end
ちゃんと文字列にする。
Rails.application.routes.draw do
constraints subdomain: 'api' do
scope module: 'api' do
namespace 'v1', format: 'json' do
resources :posts
end
end
end
end
リクエストベースの制限は、Requestオブジェクトに対してあるメソッドを呼び出すことで実行されます。メソッド呼び出し時にハッシュキーと同じ名前をメソッドに渡し、返された値をハッシュ値と比較します。従って、制限された値は、対応するRequestオブジェクトメソッドが返す型と一致する必要があります。たとえば、constraints: { subdomain: 'api' }という制限はapiサブドメインに期待どおりマッチしますが、constraints: { subdomain: :api }のようにシンボルを使用した場合はapiサブドメインに一致しません。request.subdomainが返す'api'は文字列型であるためです。
ドメインやPATHなど、文字列っぽいものは文字列で指定すべきと考えておけば良さそうです。