2011-11-15 67 views
6

我有一個Rails 3.1應用程序,我想創建一個API。我想我的網址看起來像這樣:Rails 3.1 API路線

www.example.com/controller/action // Normal Web requests 
api.example.com/controller/action.json // API requests 

第一個將是正常的請求,另一個顯然是我的API的東西。我希望這兩個映射到相同的控制器/操作。

如何設置我的應用程序,使其僅在www和json,xml等時在api子域中響應HTML?

+3

如果您打算構建一個API用於外部,我會建議使用單獨的控制器。錯誤處理對於API和UI來說完全不同。處理異常也是完全不同的。如果API方法觸發異常,我們將其格式化爲xml,並以正確的HTTP狀態返回。 – nathanvda

回答

21

最簡單的方法(imo)是使用Rails 3的路由約束。在配置/ routes.rb中,使用方法:

constraints :subdomain => 'www', :format => :html do 
    # Routing for normal web requests 
    match 'mycontroller/:action' => 'mycontroller#index' 
    # ... 
end 

constraints :subdomain => 'api', :format => :json do 
    # Routing for API requests 
    match 'mycontroller/:action.:format' => 'mycontroller#index' 
    # ... 
end 

你也可能想看看進入respond_with(和在respond_to代碼一流水平),這使得它更容易編寫,以多種格式比傳統響應控制器迴應。

3

檢查#221 Subdomains in Rails 3導軌鑄造。對於www,你可以把額外的限制「:format =>:html」。 另一種解決方案是使用控制器過濾器來檢查request.subdomain和params [:format]。那麼你不需要重複路線。