Rails 3.1 con l'ultima jQuery-UJS IE9 vuole salvare un problema con la js
-
25-10-2019 - |
Domanda
Ho una forma semplice per la presentazione di un'immagine in questo modo:
<%= form_tag avatar_item_path(@tutorial, :format => :js), :method => :post, :remote => true do %>
<%= file_field_tag :item_avatar, :name => "item_image[image]" %>
<% end %>
(Dragonfly gestisce l'immagine, nel caso in cui in qualche modo rilevante)
La mia azione di controllo si chiama update_avatar e non ha il rendering o logica respond_to (si chiama semplicemente trovare e salvare i metodi) in modo di default su un JS richiedere update_avatar.js.erb è resa.
update_avatar.js.erb contiene un JS funzionano e $(function () { // some code here })
In FF, Chrome e Safari questo funziona bene.
Il problema: IE9 vuole salvare la risposta come avatar.js
Utilizzando gli strumenti di sviluppo posso vedere che la richiesta viene inviato e ricevuto correttamente e il tipo di contenuto di risposta è "text / javascript; charset = utf-8"
Ho provato manualmente l'impostazione del tipo di contenuto a application / javascript e questo non ha avuto effetto.
Come altri hanno suggerito altrove, se ho impostato il tipo di contenuto a text / html IE9 non sarà pronta me per salvarlo ma in questo caso nessuno dei browser sarà effettivamente valutare le js nella risposta (ho messo i js in tag script).
Da ricerca sembra che circa un anno fa, altri sono stati vivendo lo stesso problema e la loro soluzione era quella di aggiornare jquery, dal momento che un anno è passato Ho una versione molto più recente. Forse questa è una regressione?
Sto usando l'ultimo jquery-rails gemma, 1.0.19, che include jQuery 1.7.1 e include anche l'ultima versione di https://github.com/rails/jquery-ujs (ho fatto un diff per essere sicuri).
Soluzione
Utilizzando File Upload Jquery
https://github.com/blueimp/jQuery-File-Upload ( versione base, non la versione UI)
Assicurarsi che l'url è il formato js esplicitamente dichiarato e impostare l'opzione dataType di 'script':
$('#item_avatar').fileupload({
url: "<%= avatar_item_path(item, :format => :js) %>",
dataType: 'script'
});
Nel vostro controller impostare il tipo di contenuto risposta a text / plain:
respond_to do |format|
format.js { render :content_type => "text/plain" } # needed for IE
end
La risposta js dovrebbe ora correttamente eval in tutti i browser!