ルーティングで api ドメイン以下だけで使用できるコントローラや Rack middleware を設定したいという場合について考えたいと思います。
サブドメインからだけアクセスできるようにする
以下のようなクラスを定義します。
config/routes.rb
class UseSubdomain
def initialize(domain)
@domain = domain
end
def matches?(request)
request.subdomain.present? && request.subdomain == @domain
end
end
以下のようにして使用します。
config/routes.rb
Test::Application.routes.draw do
constraints(UseSubdomain.new('api')) do
mount Test::Api => '/'
end
constraints(UseSubdomain.new('dashboard')) do
root to: 'dashboard#index'
end
end
ネイキッド / www ドメインからだけアクセスできるようにする
上記のままではネイキッドドメイン/www ドメインでアクセスしたい部分でもサブドメインでアクセスすることを許容してしまいますので、さらに以下のクラスを定義し、制限を行います。
config/routes.rb
class OmitSubdomain
def matches?(request)
request.subdomain.blank? || request.subdomain == 'www'
end
end
この使用方法は以下のようになります。
config/routes.rb
Test::Application.routes.draw do
constraints(OmitSubdomain.new) do
resources :articles
root to: 'site#index'
end
end