Rails 4 Turbolinks使表单多次提交

时间:2013-08-05 22:35:46

标签: javascript ruby-on-rails ruby turbolinks

我使用一些代码在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 %>

我对这段代码有两个疑问,首先:像这样的控制器代码不起作用 js代码转移到客户端但没有运行,我必须在该操作的底部添加render layout: false,在Rails 3上不需要这样做

第二个问题:当我第一次访问此页面时,重新加载页面,评论功能有效,但如果我点击其他页面的链接跳转到此页面,我提交此表单将导致多次ajax请求调用,多个评论将被创建

感谢advs

3 个答案:

答案 0 :(得分:16)

通过将= javascript_include_tag "application", "data-turbolinks-track" => true从身体移到头部来解决这个问题,谢谢你的帮助

答案 1 :(得分:9)

您可以将其保留在正文中,只需添加到脚本标记:

"data-turbolinks-eval" => false

一般来说,使用turbolinks,最好确保你的代码是“幂等的”,所以如果它运行不止一次,绑定就不会多次设置。

执行此操作的最佳方法是使用$('blah')。bind(),首先调用unbind:

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

答案 2 :(得分:1)

您可能遇到问题的一个可能原因是,如果您在每个页面上都包含js。我的理解是它会将js附加到头部,如果你将它包含在多个页面上,你会发现自己多次绑定ajax。话虽如此,你从我所看到的内容中包含js的方式并不明显。你可以通过在application.js中包含js文件来解决这个问题。