私はRailsでフォームを作成しています。これは、ajaxを介して既存の質問を編集します。
フォームが送信されて質問が更新された後、コントローラーのupdateメソッドはupdate.js.erbをレンダリングし、フォームを再び非表示にします。
私の問題は、update.js.erbのJavaScriptコードがまったく実行されないことです。
サーバー出力に表示されるため、ファイルがレンダリングされていることを知っています。
<% raise params %>
その中に、それは動作します。
ただし、最も単純な
alert('hello');
同じファイルには影響しません。
同じコードがedit.js.erbファイルで完全に機能するため、JavaScriptとjqueryの構成の問題を除外しました。 update.js.erbでは機能しません。
何が欠けていますか?
編集:
Firebugはエラーを表示しません。 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>');
def update
編集2:
これはコントローラのアクションです:
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
$.ajax
呼び出しでは、必ずdataType
オプションを"script"
に設定してください。そうしないと、応答が他の方法で解釈され、JSとして実行されない可能性があります。
Haml、またはhtml.erbを使用していますか?前者の場合、これが解決策になる可能性があります:
respond_to do |format|
...
format.js {render layout: false}
end
私はまったく同じ問題を抱えていましたが、この質問を早い段階で見つけ、グーグルで1時間ほどかけてStackOverflowでこの質問を見つけました: jQuery + Ajax + Haml js.erbファイルが起動しない
Update.js.erbファイルでは、Rubyコードを実行するたびにjavascriptをエスケープする必要があります。
$('.container').empty().append('<%=
escape_javascript(
render 'update'
)
%>')
これは私のためにそれを解決したものです...
この問題は、Controller側だけが原因ではありません。また、View側に配置することもできます。これは、投稿リクエストのデータタイプを明確にしていないためです。
コンソールで、リクエストが[〜#〜] js [〜#〜]として処理されていることを確認してください。
参考: 同様の問題
私は同じ問題に遭遇し、このページを見つけました。ここに記載されている方法を試してみましたが、うまくいきませんでした。後で、次の方法で問題が解決します。
私の元のコードは:
$('#html_id').html('<%=@Ruby_variable%>');
そして私はそれを次のように更新しました:
$('#html_id').html('<%=raw @Ruby_variable.to_json%>');
これで期待どおりに動作します。
それが何であるかを見つけました! ???? (Rails 4の解)
許可リストにないajax呼び出しパラメーターがある場合、レコードは保存されますが、「許可されていない」パラメーターに関するエラーメッセージは表示されませんが、ターミナルがあってもupdate.js.erbは実行されません「レンダリングされたupdate.js.erbなど」をフィードバックします
追加のパラメーターがモデルの属性である場合は、それを許可するだけです。
非モデルパラメータを許可する最も簡単な方法は、モデルに追加することです。
attr_accessor :paramKeyTroublesome
次に、コントローラでそれを許可することもできます。
$ ajax呼び出しでは、データを適切にハッシュする必要があります。
data: {model_name: {paramKey1: value, paramKeyTroublesome: value}}
注意すべきもう1つの問題は、update.jsファイルのエラーです。構文エラーがある場合、何も実行されません。これを確認するには、ブラウザーのインスペクターに移動してLog XMLHttpRequests
を有効にし、出力jsファイルを確認します。