2011-11-15 21 views
6

Tengo una aplicación Rails 3.1 para la que quiero crear una API. Quiero que mis urls a ser algo como:Rails 3.1 Rutas API

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

La primera de ellas sería para peticiones normales y la otra, obviamente, para mis cosas API. Me gustaría que ambos se correlacionen con el mismo controlador/acción.

¿Cómo configuro mi aplicación para que solo responda a HTML cuando estoy en www y json, xml, etc. cuando estoy en el subdominio api?

+3

Si tiene la intención de crear una API para su uso externo, le aconsejaría usar controladores por separado. El manejo de errores es totalmente diferente para una API y la IU. También manejar excepciones es para nosotros totalmente diferente. Si un método API desencadena una excepción, la formateamos a xml y la devolvemos con el estado HTTP correcto. – nathanvda

Respuesta

21

La manera más fácil (imo) sería utilizar Rails 3 restricciones de enrutamiento. En config/routes.rb, utilice:

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 

También puede ser que desee echar un vistazo a respond_with (y respond_to a nivel de clase), lo que hace que sea mucho más fácil de escribir controladores que responden a múltiples formatos que con la tradicional responder a.

3

Verificar #221 Subdomains in Rails 3 Carriles Cast. Para www puede poner contstraint adicional ": format =>: html". Otra solución sería usar el filtro del controlador que comprueba request.subdomain y params [: format]. Entonces no necesitas duplicar rutas.