5

Rails 3 では問題なく動作するコードを使用していますが、Rails 4 では動作しません。Turbolinks が原因だと思いますが、それについてはよくわかりません。問題を解決するためにこれ以上深く掘り下げることはできません。コードは次のとおりです。

見る:

a/v/m/_new_comment.slim                                                                                                                             
.new-comment                                                                                                                                         
- if current_user
  = render "editor_toolbar"
  = form_for(Comment.new, :remote => true, :url => mission_comments_path(@mission)) do |f|
  = f.text_area :content, :class => "span10",
    :rows => "4", :tabindex => "1"
  #preview.hidden
    = "Loading..." 
  = f.submit t("missions.submit_comment"),
    "data-disable-with" => t("missions.submitting"),
    :class => "btn btn-primary", :tabindex => "2"
- else
  = render "need_login_to_comment"

コントローラ:

def create
  @mission = Mission.find(params[:mission_id])
  @comment = @mission.comments.build(comment_params)
  @comment.user = current_user

  if @comment.save
  @mission.events.create(user: current_user, action: "comment")
  render layout: false
end

そしてjs:

<% if @comment.errors.any? %>                                                                                                                        
  $(".new-comment textarea").focus();
<% else %>
  $(".comments").append("<%= j (render @comment, :index => @mission.comments.count-1) %>");
  $(".new-comment #preview").addClass("hidden").html('');
  $(".new-comment textarea").css("display", "block").val('');
  $(".editor-toolbar .preview").removeClass("active");
  $(".editor-toolbar .edit").addClass("active");
<% end %>

このコードについて 2 つの質問があります。まず、このようなコントローラー コードは機能しません。js コードはクライアントに転送されますが、実行されませんrender layout: false。そのアクションの最後に追加する必要があります。Rails 3 ではこれは必要ありません。

2 番目の質問: 最初にこのページにアクセスしてページをリロードすると、コメント機能が動作しますが、他のページからリンクをクリックしてこのページにジャンプすると、このフォームを送信すると ajax リクエストが複数回呼び出され、複数のコメントが作成されます

広告のおかげで

4

3 に答える 3

10

本文に残すことができます。スクリプトタグに追加するだけです:

"data-turbolinks-eval" => false

一般に、ターボリンクでは、コードが「冪等」であることを確認するのが最善です。そのため、複数回実行された場合、バインディングが複数回セットアップされることはありません。

これを行う最善の方法は、$('blah').bind() の代わりに、最初に unbind を呼び出すことです。

 $('blah').unbind('click').bind('click', function() {
于 2013-09-17T23:37:10.500 に答える
1

問題が発生する可能性がある理由の 1 つは、すべてのページに js を含めている場合です。js を head に追加することは私の理解です。それを複数のページに含めると、ajax を複数回バインドする可能性があります。そうは言っても、私が見たものからjsをどのように含めているかは明らかではありません。application.js に js ファイルを含めるだけで、これを解決できる可能性があります。

于 2013-08-06T05:06:46.697 に答える