Rails 3.1 con los últimos jQuery-UJS IE9 quiere ahorrar respuesta como .js
-
25-10-2019 - |
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).
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!