APIのルーティングでサブドメインをapiにする制約をつけてみました。
constrains subdomain: 'api' do
resources :users
end
これで、api.domain.com/users/1
とかで取得できるのですが、そのままだとhtmlが返ってきちゃいます。
もちろんapi.domain.com/users/1.json
とかすればいいんですが、オープンなAPIにするならフォーマット指定しなきゃhtmlが返ってきてしまうAPIというのも罠臭いなーと。
constrainsはformatの制約も課せるので、
constrains subdomain: 'api', format: :json do
resources :users
end
とすれば、api.domain.com/users/1.html
のルーティングにヒットしなくなります。
あとはApplicationControllerに
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/1
はapi.domain.com/users/1.json
として処理されます。
jsonだけでなくxmlもサポートしたいのならば、constrainsのformatにxmlを増やして、各アクションで対応するだけです。
jsonだけなら基本的にアクションは書き換え無しで動きます。
また、サブドメインがapiでないURLで.jsonがヒットするのはややこしいので、
一般のルーティングをconstrains format: :html
の中に置けばOKです。