web-dev-qa-db-fra.com

Rails update.js.erb n'exécute pas javascript

Je crée un formulaire en Rails qui éditera une question existante via ajax.

Une fois le formulaire soumis et la question mise à jour, la méthode de mise à jour du contrôleur affiche update.js.erb, ce qui masquera à nouveau le formulaire.

Mon problème est que le code javascript dans update.js.erb ne s'exécute pas du tout.

Je sais que le fichier est rendu car il apparaît dans la sortie du serveur, et quand je mets un

<% raise params %>

en elle, cela fonctionne.

Cependant, même le plus simple

alert('hello');

n'a aucun effet dans le même fichier.

J'ai exclu les problèmes de configuration javascript et jquery car le même code fonctionne parfaitement dans mon fichier edit.js.erb. Cela ne fonctionne tout simplement pas dans update.js.erb.

Qu'est-ce que je rate?

Modifier:

Firebug ne montre aucune erreur. Voici la réponse dans le panneau réseau de firebug:

alert('hello');
$('#question_body').replaceWith('<h4><p>jhsdfjhdsb k jdfs j fjfhds <strong>jfshaflksd;hf sdldfs l fdsalkhdfskhdfs</strong>;fd lfdksh hfdjaadfhsjladfhsjadfs ;df sjldfsj dfas hafdsj fdas ;ldfas ldfs df dl;hdf fdh ;fdj ;lfads</p></h4>');

mise à jour def

Modifier 2:

C'est l'action du contrôleur:

def update
  respond_to do |format|
    if @question.update_attributes(params[:question])
      format.html { redirect_to @question, :flash => { :success => 'Question was successfully updated.' } }
      format.json { head :no_content }
      format.js {}
    else
      format.html { render action: "edit" }
      format.json { render json: @question.errors, status: :unprocessable_entity }
    end
  end
end
28
dmanaster

Dans votre $.ajax appelez assurez-vous de définir l'option dataType sur "script" sinon la réponse pourrait être interprétée d'une autre manière et donc non exécutée comme JS.

48
supermoogle

Travaillez-vous avec haml ou html.erb? Si le premier, alors cela pourrait être la solution:

respond_to do |format|
  ...
  format.js {render layout: false}
end

J'ai eu exactement le même problème, j'ai trouvé cette question dès le début, j'ai pris une autre heure de recherche sur Google pour trouver cette question sur StackOverflow qui m'a amené à cela: jQuery + Ajax + Haml. Fichiers js.erb ne tirant pas =

35
rmatena

Dans votre fichier update.js.erb, vous devez échapper javascript partout où vous exécutez Ruby code.

$('.container').empty().append('<%=
  escape_javascript(
    render 'update'
  )
%>')

C'est ce qui l'a résolu pour moi ...

4
Ricky Mason

Ce problème n'est pas uniquement dû au côté du contrôleur . Il peut également se trouver du côté Affichage , ce qui signifie que vous n'avez pas clarifié le type de données de votre demande de publication.

Assurez-vous dans votre console que la demande est traitée comme [~ # ~] js [~ # ~] .

Référence: problème similaire

2
Hoang Le

J'ai rencontré le même problème et j'ai trouvé cette page. J'ai essayé les méthodes énumérées ici, mais je n'ai trouvé aucune chance. Alors que plus tard, la méthode suivante résout mon problème.

Mon code d'origine était:

$('#html_id').html('<%=@Ruby_variable%>');

Et je l'ai mis à jour pour:

$('#html_id').html('<%=raw @Ruby_variable.to_json%>');

Maintenant, cela fonctionne comme prévu.

1
wyncg

Découvrez ce que c'est! ???? (solution pour Rails 4)

Si vous avez dans vos paramètres d'appel ajax qui ne figurent pas dans votre liste autorisée, l'enregistrement est sauvegardé, vous ne recevez aucun message d'erreur sur les paramètres "non autorisés", mais le update.js.erb ne fonctionnera pas - même si votre terminal va renvoyer 'Rendered update.js.erb etc'

Si le paramètre supplémentaire est un attribut dans votre modèle, permettez-le simplement.

La façon la plus simple d'autoriser un paramètre non modèle est d'ajouter votre modèle:

  attr_accessor :paramKeyTroublesome

Ensuite, vous pouvez également l'autoriser dans le contrôleur.

dans l'appel $ ajax, les données doivent être hachées correctement:

  data: {model_name: {paramKey1: value, paramKeyTroublesome: value}}
0
Daniela

Un autre problème à connaître est une erreur dans votre fichier update.js. Rien ne s'exécutera s'il y a des erreurs de syntaxe. Vous pouvez le vérifier en accédant à l'inspecteur de votre navigateur et en activant Log XMLHttpRequests Puis en examinant le fichier js de sortie.

0
Shadoath