32

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>');

デフォルト更新

編集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
4

7 に答える 7

53

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

于 2013-12-31T01:07:08.717 に答える
38

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

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

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

于 2013-12-29T23:19:56.620 に答える
4

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

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

これが私にとってそれを解決したものです...

于 2014-04-08T19:09:02.663 に答える
2

この問題はコントローラー側だけが原因ではありません。また、投稿リクエストのデータ型を明確にしていないビュー側にある可能性もあります。

リクエストがJSとして扱われることをコンソールで確認してください。

参考: 類似問題

于 2014-08-08T07:29:59.823 に答える
1

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

私の元々のコードは次のとおりです。

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

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

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

今では期待どおりに動作します。

于 2015-04-02T17:27:53.607 に答える
0

それが何であるかを発見しました!(レール 4 のソリューション)

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

追加のパラメーターがモデルの属性である場合は、許可してください。

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

  attr_accessor :paramKeyTroublesome

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

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

  data: {model_name: {paramKey1: value, paramKeyTroublesome: value}}
于 2017-07-16T03:13:13.803 に答える