2011-11-15 18 views
6

Mam aplikację Rails 3.1, dla której chcę utworzyć API. Chcę, by moje adresy URL, aby wyglądać tak:Rails 3.1 API Routes

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

Pierwszy z nich byłby dla normalnych żądań i drugi oczywiście dla mojego API rzeczy. Chciałbym, aby oba te elementy zostały odwzorowane na ten sam kontroler/działanie.

Jak skonfigurować moją aplikację, aby odpowiadała tylko na HTML, gdy na stronie www i json, xml, itp., Gdy jestem na subdomenie API?

+3

Jeśli masz zamiar zbudować API do użytku zewnętrznego, radziłbym użyć oddzielnych kontrolerów. Obsługa błędów jest zupełnie inna w przypadku interfejsu API i interfejsu użytkownika. Również obsługa wyjątków jest dla nas zupełnie inna. Jeśli metoda API wyzwoli wyjątek, sformatujemy go do formatu xml i zwrócimy go z prawidłowym stanem HTTP. – nathanvda

Odpowiedz

21

Najprostszym sposobem (imo) byłoby użycie ograniczeń routingu Rails 3. W config/routes.rb, użyj:

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 

kupili także rzucić okiem do respond_with (i respond_to na poziomie klasy), który sprawia, że ​​znacznie łatwiej napisać kontrolery, które odpowiadają wielu formatach niż tradycyjny odpowiedzi na.

3

Sprawdź #221 Subdomains in Rails 3 Rails Cast. Dla www możesz umieścić dodatkowe ograniczenie ": format =>: html". Innym rozwiązaniem byłoby użycie filtra kontrolera, który sprawdza request.subdomain i parametry [: format]. Wtedy nie musisz duplikować tras.