Rails 3.1 с последней версией jQuery-UJS IE9 хочет сохранить ответ как .js - PullRequest
3 голосов
/ 29 ноября 2011

У меня есть простая форма для отправки изображения, например:

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

(стрекоза обрабатывает изображение, если это как-то актуально)

Мое действие контроллера называется update_avatar, и в нем нет логики render или response_to (он просто вызывает методы поиска и сохранения), поэтому по умолчанию при запросе js отображается update_avatar.js.erb.

update_avatar.js.erb содержит функцию js и $(function () { // some code here })

В FF, Chrome и Safari это отлично работает.

Проблема: IE9 хочет сохранить ответ как avatar.js

Используя инструменты разработчика, я вижу, что запрос отправляется и принимается правильно, и тип содержимого ответа "text / javascript; charset = utf-8"

Я попытался вручную установить тип содержимого для application / javascript, но это не дало эффекта.

Как другие предлагали в другом месте, если я установлю тип содержимого в text / html, IE9 не предложит мне сохранить его, но в этом случае ни один из браузеров не будет оценивать js в ответе (я помещаю js в теги скрипта).

По результатам поиска кажется, что около года назад другие испытывали ту же проблему, и их решением было обновить jquery, так как прошел год, у меня гораздо более новая версия. Возможно, это регрессия?

Я использую последний гем jquery-rails, 1.0.19, который включает в себя jquery 1.7.1, а также последнюю версию https://github.com/rails/jquery-ujs (я сделал diff, чтобы убедиться).

1 Ответ

1 голос
/ 01 декабря 2011

Использование загрузки файла Jquery

https://github.com/blueimp/jQuery-File-Upload (базовая версия, а не версия пользовательского интерфейса)

Убедитесь, что в URL явно указан формат js, и установите для параметра dataType значение 'script ':

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

В вашем контроллере установите тип содержимого ответа text / plain:

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

Ответ js теперь должен корректно вычисляться во всех браузерах!

...