Javascript Rails 4 TurboLink使表单多次提交

Javascript Rails 4 TurboLink使表单多次提交,javascript,ruby-on-rails,ruby,turbolinks,Javascript,Ruby On Rails,Ruby,Turbolinks,我在Rails 3上使用了一些代码,但在Rails 4上没有,我想这是由TurboLink引起的,但我对它了解不多,无法深入挖掘来解决我的问题,以下是代码: 视图: 控制器: def create @mission = Mission.find(params[:mission_id]) @comment = @mission.comments.build(comment_params) @comment.user = current_user if @comment.save

我在Rails 3上使用了一些代码,但在Rails 4上没有,我想这是由TurboLink引起的,但我对它了解不多,无法深入挖掘来解决我的问题,以下是代码:

视图:

控制器:

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 %>

$(“.new comment textarea”).focus();
$(“.comments”)。追加(“@mission.comments.count-1)%>”;
$(“.newcomment#preview”).addClass(“hidden”).html(“”);
$(“.new comment textarea”).css(“显示”、“块”).val(“”);
$(“.editor toolbar.preview”).removeClass(“活动”);
$(“.editor toolbar.edit”).addClass(“活动”);
我对这段代码有两个问题,第一:像这样的控制器代码不起作用 js代码被传输到客户端但没有运行,我必须在该操作的底部添加
render layout:false
,在Rails 3上不需要这样做

第二个问题:当我第一次访问此页面时,重新加载页面,注释功能可以工作,但是如果我单击其他页面的链接跳转到此页面,我提交此表单将导致ajax请求调用多次,将创建多个注释


感谢advs

您可能会遇到问题的一个原因是,如果您在每个页面上都包含js。据我所知,它会将js附加到头部,如果您在多个页面中包含它,您可能会发现自己多次绑定ajax。尽管如此,从我看到的情况来看,你是如何包含js的还不清楚。您可以通过在应用程序中只包含js文件来解决此问题。js通过将
=javascript\u include\u标记“application”,“data turbolinks track”=>true
从一个正文移到另一个正文来解决此问题,谢谢您的帮助您可以将其留在正文中,您只需要添加到脚本标记中:

"data-turbolinks-eval" => false
一般来说,使用TurboLink时,最好确保代码是“幂等的”,因此如果它运行多次,绑定将不会得到多次设置

最好的方法是先调用unbind,而不是$('blah').bind():

 $('blah').unbind('click').bind('click', function() {

我不能评论你的具体代码,但你可以尝试删除turbo链接,看看它是否可以不使用。只需从application.js文件中删除turbolinks,使其工作我只在应用程序中包含js文件,所以我认为这可能不是原因,顺便说一下,上面的视图代码是作为一部分包含的,这可能是原因吗?是的。有一些复杂的插件来尝试解决它,但我发现unbind()更简单、更有效,尽管它确实增加了一些丑陋的东西!与其再次解除绑定和绑定,不如执行
$(document)。谢谢你的建议!帮了我大忙,一个小时都不知道出了什么问题!确实应该在文档中的某个地方,通常建议在之前移动脚本
 $('blah').unbind('click').bind('click', function() {