Rails 3 prototype rendu: la réponse à la mise à jour a un type de contenu texte / HTML

J'essaie d'obtenir un code RJS écrit avec un prototype et Rails 2.3.11 pour fonctionner dans Rails 3.2.1

J'ai le joyau prototype-rails , alors render :update do |page| Fonctionne, j'utilise un formulaire avec :remote => true qui envoie une requête ajax au contrôleur, et le javascript semble être généré ok.

Cependant, le type de contenu dans l'en-tête de la réponse est text/html; charset=utf-8 text/html; charset=utf-8 , qui devrait être text/javascript .

Dans le contrôleur, je l'appelle comme suit:

 render :update do |page| if @step.errors.empty? page.redirect_to how_to_path(@article.id) else page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true} end end 

Il semble générer le code window.location.href... et Element.update... ok, mais il ne s'exécute pas car le type de contenu est incorrect.

Y at-il quelque chose que je ferais mal qui pourrait causer cela? J'ai besoin d'une solution qui permettra aux rj avec un prototype de travail. JQuery sera probablement utilisé à l'avenir, mais faire ce changement en ce moment n'est pas une option.

Mise à jour: J'ai essayé quelques autres façons d'écrire le code, y compris la spécification :content_type => "text/javascript" en render , l'enrouler dans un bloc format.js avec format.js et le réécrire comme fichier js.erb , mais Tout est toujours en train de revenir avec text/html comme type de contenu dans l'en-tête de réponse.

Mise à jour, j'ai compris comment obtenir le comportement attendu en ajoutant des en- headers["Content-Type"] = "text/javascript; charset=utf-8" dans le contrôleur avant le render , mais cela ne semble pas vraiment le meilleur Façon de le faire si je dois l'ajouter explicitement avant chaque instance RJS. Je voudrais une solution plus propre si quelqu'un peut en arriver.

Mise à jour Il s'avère que nous avions un before_filter cours d'exécution avant chaque demande qui définissait le type de contenu dans text / html. J'ai supprimé ceci et j'ai pu supprimer tous les codes headers["Content-Type"] que j'ai ajouté. Cela a fonctionné dans mon environnement de développement, mais pas dans notre environnement de vérification des tests. Cela s'est avéré être que nous avions des anciens actifs mis en cache là-bas, donc la vérification exécutait le prototype 1.6.1, alors que mon environnement de développement local avait 1,7.0. Cela a provoqué des rails.js ne pas compiler dans la vérification, de sorte que toutes les demandes avaient un Accepts: text/html au lieu de text/javascript . Flushing ce cache a chargé la version plus récente du prototype et réglé le problème.

Il s'avère que nous avions un before_filter qui était exécuté avant chaque demande définissant le type de contenu dans text / html. J'ai supprimé cela, et cela a fonctionné sans le hack ci-dessous.

Mais si vous avez besoin d'une solution de contournement, voici ce que j'ai fait ci-dessous.

La seule chose que je trouve que cela fonctionne, c'était d'ajouter des en- headers["Content-Type"] = "text/javascript; charset=utf-8" avant le render :update

 headers["Content-Type"] = "text/javascript; charset=utf-8" render :update do |page| if @step.errors.empty? page.redirect_to how_to_path(@article.id) else page.replace_html 'add_step_form', :partial => 'how_to/add_step', :locals => {:step => @step, :altered => true} end end 

Malheureusement, j'ai dû l'ajouter à chaque endroit dans le code où le render :update RJS render :update est appelée.