2010-01-22 8 views
6

Hasta ahora siempre he especificado el formato de la respuesta a las acciones utilizando un bloque responds_to, así:¿Siempre usas responds_to?

responds_to do |format| 
    format.js { render :json => @record } 
end 

Recientemente he dado cuenta de que si es compatible con un formato (como en el ejemplo anterior), que Don Realmente necesitas ese bloque. ¿Es una buena práctica dejarlo o eliminarlo?

Respuesta

2

Voy a diferir con los actuales respuestas- -Me gusta tener un bloque responds_to para todas mis acciones. Me parece que, aunque es un poco más detallado, es más claro auto-documenta la acción. También hace que sea más fácil admitir formatos adicionales en el futuro. Editar: otra ventaja es que actúa como un guardián. Cualquier formato no declarada en el bloque se sirve automáticamente un "406 No Aceptable"

+0

no había pensado en la idea portero, agradable. –

+0

es que el caso, que en mi ejemplo anterior una solicitud (para html, sin .js) obtendría un 406 y solo el registro JSON sin el encabezado correcto? si es así, eso es enorme ... – tfwright

+0

Sí, con su bloque 'responds_to' arriba, una solicitud para .xml, .html, etc. debería devolver' 406 Not Acceptable'. – Ben

0

No estoy seguro si esto es una buena práctica o no, pero generalmente lo que quiero hacer es dejar las rutas abiertas para responder_a (es decir, al agregar .:format al final), pero solo usarlo en los controladores cuando es necesario

Ejemplo:

routes.rb

map.connect :controller/:action/:id.:format 

model_controller.rb

# Return a collection of model objects 
def action_with_multiple_responses 
    @models = Model.all 

    respond_to do |format| 
    format.html #=> action_with_multiple_responses.html 
    format.xml { render :xml => @models } 
    end 
end 

# Return the first model object 
def action_with_one_response 
    @model = Model.first 
end 

De esa manera, no son desordenados en el método de action_with_one_response con un bloque innecesaria , pero también te has configurado bastante bien si quieres algún día devolver el objeto en XML, JSON, etc.

+0

creo: formato se añade por defecto. – vise

+1

Es si usa 'map.resources', pero no lo creo si solo usa' map.connect' - al menos, esa ha sido mi experiencia (a menos que esté haciendo algo diferente). – jerhinesmith

+0

Sí, map.resources establecerán una serie de rutas RESTful conectados al controlador especificado. Connect establece una ruta específica en el formato especificado. –

0

yo diría que no usar respond_to a menos que tenga múltiples tipos de respuesta.

Se trata simplemente de código adicional para entender y para su aplicación para procesar y mango:

render :json => @record 

es mucho más concisa que:

responds_to do |format| 
    format.js { render :json => @record } 
end 
Cuestiones relacionadas