rails ruby-on-rails ruby ajax file-upload ruby-on-rails-4

ruby-on-rails - upload pdf rails



Rails 4: Cómo subir archivos con AJAX (2)

Quiero subir archivos con AJAX. En el pasado, logré esto utilizando el complemento mágico del formulario jQuery y funcionó muy bien. Actualmente estoy creando una aplicación de Rails y tratando de hacer las cosas "The Rails Way", así que estoy usando Form Helper y la gema de clip para agregar archivos adjuntos.

Los documentos de Rails advierten que Form Helper no funciona para las cargas de archivos AJAX:

A diferencia de otras formas, hacer una forma asíncrona de carga de archivos no es tan simple como proporcionar form_for con remote: true. Con un formulario Ajax, la serialización se realiza mediante JavaScript que se ejecuta dentro del navegador y como JavaScript no puede leer archivos de su disco duro, no se puede cargar el archivo. La solución más común es usar un iframe invisible que sirva como objetivo para el envío del formulario.

Parece claro que no hay una solución estándar. Así que me pregunto qué es lo más inteligente que hacer. Parece que tengo varias opciones:

  1. Utilice el formulario de ayuda y el truco de iframe.
  2. Use el asistente de formulario + cargar el complemento de formulario jQuery para enviar el archivo (no estoy seguro de si esto funcionará bien con el token de autenticidad de Rails, etc.)
  3. Use el formulario helper + paperclip + [alguna otra gema] para ampliar su funcionalidad y permitir el envío de formularios AJAX.

Los tres parecen posibles. Sé lo menos sobre el # 3, específicamente la parte [alguna otra gema]. Encontré dos preguntas similares ( this y this ) que mencionan una rama de Pic-Upload llamada Uploadify, pero ambas tienen 2 años y tratan con los Rails 2 y 3 (y Uploadify no se ha actualizado en años). Entonces, dado lo mucho que ha cambiado, creo que esta es una pregunta realmente nueva:

¿Cuál es la mejor manera de cargar archivos con AJAX en Rails 4?


IMHO Rails no es perfecto cuando se trata de cargar archivos usando AJAX, especialmente si desea una barra de progreso. Mi sugerencia es usar Javascript para el envío del formulario en una solicitud AJAX como sugirió en (2). Si te sientes cómodo con Javascript no tendrás muchos problemas.

Recientemente utilicé el mismo enfoque al usar esta muy sencilla biblioteca JS https://github.com/hayageek/jquery-upload-file y escribí más detalles aquí http://www.alfredo.motta.name/upload-video-files-with-rails-paperclip-and-jquery-upload-file/

Para una aplicación con un formulario para cargar una película con título y descripción, el código JS tiene el siguiente aspecto:

$(document).ready(function() { var uploadObj = $("#movie_video").uploadFile({ url: "/movies", multiple: false, fileName: "movie[video]", autoSubmit: false, formData: { "movie[title]": $(''#movie_title'').text(), "movie[description]": $(''#movie_description'').text() }, onSuccess:function(files,data,xhr) { window.location.href = data.to; } }); $("#fileUpload").click(function(e) { e.preventDefault(); $.rails.disableFormElements($($.rails.formSubmitSelector)); uploadObj.startUpload(); }); });

Lejos de ser perfecto, pero le da flexibilidad en su interfaz.