Edited at

Railsのルーティングとフォーマット

More than 5 years have passed since last update.

APIのルーティングでサブドメインをapiにする制約をつけてみました。


routes.rb

constrains subdomain: 'api' do

resources :users
end

これで、api.domain.com/users/1とかで取得できるのですが、そのままだとhtmlが返ってきちゃいます。

もちろんapi.domain.com/users/1.jsonとかすればいいんですが、オープンなAPIにするならフォーマット指定しなきゃhtmlが返ってきてしまうAPIというのも罠臭いなーと。

constrainsはformatの制約も課せるので、


routes.rb

constrains subdomain: 'api', format: :json do

resources :users
end

とすれば、api.domain.com/users/1.htmlのルーティングにヒットしなくなります。

あとはApplicationControllerに


application_controller.rb

  before_filter :set_api_format

private
def set_api_format
if request.subdomain == 'api' and request.format == :html
request.format = :json
end
end


とすれば、api.domain.com/users/1.htmlはルーティングにヒットされなくなり、

api.domain.com/users/1api.domain.com/users/1.jsonとして処理されます。

jsonだけでなくxmlもサポートしたいのならば、constrainsのformatにxmlを増やして、各アクションで対応するだけです。

jsonだけなら基本的にアクションは書き換え無しで動きます。

また、サブドメインがapiでないURLで.jsonがヒットするのはややこしいので、

一般のルーティングをconstrains format: :htmlの中に置けばOKです。