Estoy intentando utilizar respond_to para servir un contenido
diferente a las peticiones ajax de un controlador tal que
así:
def contacts @company = Company.find params[:id]
respond_to do |format|
format.js { render :json => @company.contacts.collect{ |contact|
contact.user }.to_json }
format.html
end
end
No consigo hacerlo funcionar, siempre responde con HTML. He probado a
hacerlo “a la antigua”, comprobando si request.xhr? y funciona bien.
¿Se me escapa algo?
–
David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo
si no me equivoco respond_to es parte del nuevo sistema RESTful de rails,
para que funciones deberias generar una ruta:
Hola Hernán,
Por lo que he leído en la documentación de respond_to, no es necesario
generar una ruta para utilizarlo, leyendo un poquito más he encontrado
que la respuesta del respond_to va en función de la cabecera http
accept, yo estoy utilizando jquery para hacer las llamadas ajax, he
estado mirando su código y parece que no utiliza esta cabecera (no se
si prototype lo hace).
David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo
Poniéndonos mas interesantes podrías hacer esto( ver el manual del API)
Mime::Type.register “application/json”, :json
Eso es lo que probé y funciona a la super-perfección, no me explico
nada bien
Un saludo Hernán.
David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo
David
muy bueno el tip, para tenerlo en cuenta.
Con respecto a los headers me parece que es mas una cuestión de diseño,
el
header Accept lo que dice es que es lo que se espera como respuesta,
debes
pedir solo lo que entiendes…
Supongo que Prototype envÃa un Accept multiformato para que te sea mas
facil
entender que pasa si no anda como esperas.
Los templates RJS lo que sirven es código javascript que es evaluado del
lado del cliente.
Estoy teniendo el mismo problema que comentáis aquÃ, pero no consigo
llegar a la solución.
def index @tracks = @catalog.tracks
respond_to do |format|
format.html # index.rhtml
format.js # index.rjs
format.xml { render :xml => @tracks.to_xml }
end
end
end
En mi aplicación puedo servir la información @tracks en diferentes
formatos, pero el problema es que cuando hago una petición ajax a esta
acción siempre me devuelve html. En el directorio tengo los ficheros
index.rhtml y index.rjs. Si borro el fichero index.rhtml las peticiones
ajax funcionan correctamente. No se como indicar de forma explicita que
quiero que la información sea js para ese formato y devuelve la vista
index.rjs
Bueno, acabo de hacer la prueba introduciendo la cabecera http accept
en las llamadas ajax que hago desde jquery y funciona perfectamente:
// Esta línea la inserté en jquery, justo antes de enviar la petición xmlhttp:
xml.setRequestHeader(“Accept”, “application/javascript”);
El asunto es que no me parece correcto. Con ese código estoy diciendo
que espero una respuesta con media type application/javascript, cuando
en realidad lo que estoy sirviendo con Rails es json o fragmentos de
html. Creo que se está enfocando un poquito mal: en la versión de
prototype que se sirve con Rails he visto que se envía la cabecera
http accept con esta estructura:
Yo no he utilizado templates RJS y no se si lo que se sirve con esos
templates es un cacho de código javascript, en caso de que no sea así
lo que se debería hacer es cambiar la cabecera Accept en función del
tipo de datos que estemos esperando (normalmente application/xml,
application/json o text/plain para fragmentos html o texto sin
formatear)
–
David A., el único desarrollador con una orden de alejamiento de
Jeffrey Zeldman Simplelogica.net, ahora con un 33,3% más de intromisión en listas de correo