Frage

Ich habe ein einfaches Formular zum Einreichen eines Bildes wie SO:

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

(Dragonfly behandelt das Bild, falls dies irgendwie relevant ist)

Meine Controller -Aktion heißt update_avatar und enthält keine Render- oder Response_to -Logik (es werden nur Methoden aufgerufen und speichern). Daher wird ein JS -Request update_avatar.js.ERB standardmäßig gerendert.

update_avatar.js.erb enthält eine JS -Funktion und $(function () { // some code here })

In FF, Chrome und Safari funktioniert dies gut.

Das Problem: IE9 will die Antwort als avatar.js speichern

Mit den Entwickler-Tools kann ich feststellen, dass die Anforderung korrekt gesendet und empfangen wird und der Typ des Antwortinhaltstyps "Text/JavaScript; CharSet = Utf-8" lautet:

Ich habe versucht, den Inhaltstyp manuell auf Anwendung/JavaScript einzustellen, und dies hatte keine Wirkung.

Wie andere an anderer Stelle vorgeschlagen haben, fordert mich der Inhaltstyp auf Text/HTML IE9 nicht auf, ihn zu speichern, aber in diesem Fall wird keiner der Browser die JS in der Antwort tatsächlich bewertet (ich stecke die JS in Skript-Tags) .

Von der Suche scheint es, dass vor ungefähr einem Jahr andere das gleiche Problem erlebten und ihre Lösung darin bestand, JQuery zu verbessern. Seit einem Jahr habe ich eine viel neuere Version. Vielleicht ist das eine Regression?

Ich verwende das neueste JQuery-Rail-Gem, 1.0.19, der JQuery 1.7.1 und auch die neueste Version von enthält https://github.com/rails/jquery-ujs (Ich habe einen Unterschied gemacht, um sicherzugehen).

War es hilfreich?

Lösung

Verwenden Sie JQuery -Datei hochladen

https://github.com/blueimp/jquery-file-upload (Grundversion, nicht UI -Version)

Stellen Sie sicher, dass die URL das JS -Format explizit angegeben hat, und setzen Sie die Datentypoption auf "Skript" fest:

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

Setzen Sie in Ihrem Controller den Antwortinhaltstyp auf Text/Ebene:

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

Die JS -Antwort sollte jetzt in allen Browsern richtig bewerten!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top