web-dev-qa-db-ja.com

Rails update.js.erbがJavaScriptを実行しない

私は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
28
dmanaster

$.ajax呼び出しでは、必ずdataTypeオプションを"script"に設定してください。そうしないと、応答が他の方法で解釈され、JSとして実行されない可能性があります。

48
supermoogle

Haml、またはhtml.erbを使用していますか?前者の場合、これが解決策になる可能性があります:

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

私はまったく同じ問題を抱えていましたが、この質問を早い段階で見つけ、グーグルで1時間ほどかけてStackOverflowでこの質問を見つけました: jQuery + Ajax + Haml js.erbファイルが起動しない

35
rmatena

Update.js.erbファイルでは、Rubyコードを実行するたびにjavascriptをエスケープする必要があります。

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

これは私のためにそれを解決したものです...

4
Ricky Mason

この問題は、Controller側だけが原因ではありません。また、View側に配置することもできます。これは、投稿リクエストのデータタイプを明確にしていないためです。

コンソールで、リクエストが[〜#〜] js [〜#〜]として処理されていることを確認してください。

参考: 同様の問題

2
Hoang Le

私は同じ問題に遭遇し、このページを見つけました。ここに記載されている方法を試してみましたが、うまくいきませんでした。後で、次の方法で問題が解決します。

私の元のコードは:

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

そして私はそれを次のように更新しました:

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

これで期待どおりに動作します。

1
wyncg

それが何であるかを見つけました! ???? (Rails 4の解)

許可リストにないajax呼び出しパラメーターがある場合、レコードは保存されますが、「許可されていない」パラメーターに関するエラーメッセージは表示されませんが、ターミナルがあってもupdate.js.erbは実行されません「レンダリングされたupdate.js.erbなど」をフィードバックします

追加のパラメーターがモデルの属性である場合は、それを許可するだけです。

非モデルパラメータを許可する最も簡単な方法は、モデルに追加することです。

  attr_accessor :paramKeyTroublesome

次に、コントローラでそれを許可することもできます。

$ ajax呼び出しでは、データを適切にハッシュする必要があります。

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

注意すべきもう1つの問題は、update.jsファイルのエラーです。構文エラーがある場合、何も実行されません。これを確認するには、ブラウザーのインスペクターに移動してLog XMLHttpRequestsを有効にし、出力jsファイルを確認します。

0
Shadoath