Usando respond_to para una degradación elegante con ajax en RoR 2.x
-
02-07-2019 - |
Pregunta
Estaba revisando el libro AWDR sobre desarrollo web con ruby ??on rails y uno de los problemas con el código anterior era que no usaba responder_to para asegurarme de que la vista utilizada fuera la vista de JavaScript. Ahora, en algunos ejemplos actualizados, he visto a personas mencionarlos más tarde, al implementar una degradación elegante, use request.xhr? para saber si el usuario tiene habilitado javascript y, si no, redirige al usuario.
Me preguntaba si podría usar respond_to para obtener el mismo comportamiento y, de ser así, si esto se considera una buena forma o no y ¿por qué?
Entonces, lo que estoy pensando hacer es algo como:
def function
respond_to do |format|
format.js do
basic_stuff
end
format.html do
basic_stuff
user_redirect
end
end
end
Parece violar el principio DRY, y probablemente me falta algo sobre cómo el usuario y el servidor están interactuando aquí. Para ser sincero, la documentación de la API no me lo dejó completamente claro.
Solución
Bueno, puedes refactorizar así:
def function
basic_stuff # executed regardless of the mime types accepted
respond_to do |format|
format.html do
user_redirect
end
end
# will fall back rendering the default view - which you should ensure will be js
end
request.xhr?
mira el encabezado X-Requested-With
de la solicitud (para ver si contiene " XMLHttpRequest "). respond_to
examina los tipos mime aceptados.
Puede usar cualquiera de los dos para implementar algún tipo de degradación elegante.
PERO No podrá usar xhr?
para una degradación elegante a menos que sus llamadas ajax estén configurando ese encabezado (Prototype lo hace automáticamente).
Además, respond_to
ofrece más flexibilidad, es decir, enviar xml, json, js, lo que sea desde el mismo bloque.
Así que recomendaría responder_to
aquí.