Al enrutar recursos en Rails, el atributo de formato opcional se agrega automáticamente a las rutas generadas. Esto es para que el recurso en cuestión se pueda solicitar como XML, HTML, etc. Los formatos que realmente se permiten generalmente se describen en el controlador usando respond_to
.Cómo limitar los formatos de recursos en el archivo de rutas de Rails
Pero en muchos casos solo desea admitir HTML y se siente como una sobrecarga escribir respond_to :html
en cada acción en cada controlador. Por lo tanto, sería fantástico si ya existiera una forma de limitar los tipos de contenido permitidos al construir las rutas en el archivo routes.rb, p.
map.resources :users, :formats => :html
map.resources :users, :formats => [:html, :xml]
map.resources :users, :formats => {:index => :html, :show => [:html, :xml]}
¿Hay alguna manera de lograr esto ya sea nativo o mediante un complemento?
P.S. La forma habitual de evitar esto es simplemente ignorar el problema y no usar respond_to
en las acciones. Pero esto en realidad no limita los tipos de contenido permitidos. En su lugar, solo espera que exista una plantilla en el directorio de vistas para cada tipo de contenido posible. Si no existe uno cuando se solicita, el sistema lanzará un error HTTP 500.
No, un error 500 significa que algo salió mal en el servidor . Si no se admite un tipo de contenido, no se trata de un error del servidor; es un error del cliente (el cliente no debería haberlo solicitado). Un 406 sería el código de respuesta correcto. Consulte "Códigos de respuesta HTTP": http://www.sitepoint.com/blogs/2008/02/04/restful-rails-part-i/ –
Seguramente si va a etiquetar .xml o .html al final de la URL y ese formato no son compatibles, entonces debe devolver 404 no encontrado. ¡Parece descarado ignorar el uso de conneg al crear URL para cada tipo de contenido, pero luego robar el código de respuesta para cuando no haya un tipo de contenido válido en el encabezado accept! –
Bueno, quizás tengas razón, a pesar de que así es como Rails funciona de la caja. Pero, sin embargo, este no es el punto de mi pregunta. Todavía me gustaría especificar esto en una ubicación central (preferiblemente el archivo de rutas), sin importar si se devuelve un 404 o un 406 en el error –