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
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.
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 =
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 ...
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
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.
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}}
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.