2012-03-07 9 views
5

En mi aplicación actual de rieles estoy usando una biblioteca ajax uploader que requiere que respondas con json {success:true} para indicar que un archivo se cargó correctamente.Rails JS Response, representa tanto el estado como la plantilla?

En mi aplicación, los archivos son imágenes y, después de cargarlas, me gustaría añadirlas a la página. Normalmente yo haría algo como:

respond_to do |format| 
    format.html { redirect_to @resource, :notice => 'Created.' } 
    format.js 
end 

En el ejemplo anterior mi respuesta JS haría que la plantilla adecuada, tal como create.js.erb que podría decir algo como ...

$('#resources').append('<%= escape_javascript(render '@resource') %>'); 

Esta es la forma que tengo hecho cosas como comentarios de Ajax, etc. en el pasado. Ahora, para obtener el cargador de trabajo mi bloque respond_to actualmente funciona esto:

format.js { render :json => { :success => true } } 

Esto hace que el trabajo de cargador, pero me parece excluir la adición parciales prestados a la página como lo haría normalmente con una respuesta Ajax.

Mi pregunta es, ¿hay alguna manera de lograr ambas cosas? En caso negativo, ¿cómo llenarías la página con los objetos renderizados una vez que se hayan creado correctamente?

Respuesta

3

No puede hacer ambas cosas directamente desde el controlador o utilizando plantillas de vista. Parece que ajax uploader espera una respuesta que pueda analizarse como JSON, por lo que agregar cualquier otra respuesta usando una plantilla (lo que significaría no hacer format.js { render :json => { :success => true }}) no enviará a JSON como el cuerpo de la respuesta.

En cuanto al complemento source, puede ver que puede definir un método para ejecutar onComplete que le dará la respuesta JSON.

Esto no se ha probado, pero debería acercarlo. Por lo que si extiende su respuesta JSON como

format.js do 
    partial = render_to_string @resource 
    render :json => { :success => true, :partial => partial } 
end 

Luego, en su javascript en la página cuando la configuración de su cargador Ajax, añadir la devolución de llamada

var uploader = new qq.FileUploader({ 
    element: document.getElementById('file-uploader'), 
    action: '/upload', 
    onComplete: function(id, fileName, responseJSON) { 
    $('#resources').append(responseJSON.partial); 
    } 
}); 
+0

Esta idea funciona. No sabía sobre 'render_to_string', pero en las pruebas descubrí que también podía usar' .getScript' en la devolución de llamada para recuperar el parcial. Tu método es más limpio. ¡Gracias! – Andrew

+0

Una nota ... por defecto 'escape_javascript' no está disponible para el controlador, y no es necesario porque el método' render: json' lo hace de todos modos. – Andrew

+0

genial, me alegro de que ayude. Tiene sentido que 'escape_javascript' no funcione allí, no sé lo que estaba pensando. Gracias por los comentarios sobre la respuesta – danivovich

Cuestiones relacionadas