Pregunta

Tengo un formulario simple para enviar una imagen así:

<%= form_tag avatar_item_path(@tutorial, :format => :js), :method => :post, :remote => true do %>
  <%= file_field_tag :item_avatar, :name => "item_image[image]" %>
<% end %>

(Dragonfly maneja la imagen, en caso de que sea relevante)

Mi acción del controlador se llama update_avatar y no tiene render o responde_to logic (solo llama métodos de búsqueda y guardado), por lo que de manera predeterminada en una solicitud JS update_avatar.js.erb se representa.

update_avatar.js.erb contiene una función JS y $(function () { // some code here })

En FF, Chrome y Safari esto funciona bien.

El problema: IE9 quiere guardar la respuesta como avatar.js

Usando las herramientas de desarrollador, puedo ver que la solicitud se envía y se recibe correctamente y el tipo de contenido de respuesta es "Text/JavaScript; Charset = UTF-8"

He intentado configurar manualmente el tipo de contenido en la aplicación/JavaScript y esto no tuvo efecto.

Como otros han sugerido en otro lugar, si configuro el tipo de contenido en texto/html, IE9 no me pedirá que lo guarde, pero en este caso ninguno de los navegadores realmente evaluará el JS en la respuesta (pongo las JS en las etiquetas de script) .

Desde la búsqueda, parece que hace aproximadamente un año otros estaban experimentando el mismo problema y su solución era actualizar jQuery, ya que ha pasado un año, tengo una versión mucho más nueva. ¿Quizás esto es una regresión?

Estoy usando la última gema jQuery-Rails, 1.0.19, que incluye jQuery 1.7.1 y también incluye la última versión de https://github.com/rails/jquery-UJS (Hice una diferencia para asegurarme).

¿Fue útil?

Solución

Uso de la carga de archivos jQuery

https://github.com/blueimp/jquery-file-upload (versión básica, no versión de interfaz de usuario)

Asegúrese de que la URL tenga el formato JS establecido explícitamente y establezca la opción del tipo de datos en 'script':

$('#item_avatar').fileupload({
  url: "<%= avatar_item_path(item, :format => :js) %>",
  dataType: 'script'
});

En su controlador, establezca el tipo de contenido de respuesta en texto/simple:

respond_to do |format|
  format.js { render :content_type => "text/plain" } # needed for IE
end

¡La respuesta JS ahora debe evaluar correctamente en todos los navegadores!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top