2013-08-05 146 views
5

我使用一些代码在Rails 3上很好地工作,但不在Rails 4上,我想这是由Turbolinks引起的,但我对它不了解,不能深入挖掘解决我的问题,这里是代码: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,没必要这样on rails 3

第二个问题:当我第一次访问这个页面时,重新加载页面,评论函数的作品,但是如果我点击了其他页面的链接跳转到这个页面,我提交这个表单会导致ajax请求调用multiple次,将会创建多个评论

谢谢你的支持

+0

我不能在你的特定代码发表评论,但你可以尝试删除涡轮链接并查看它是否可用。 [删除turbolinks的说明](http://blog.steveklabnik.com/posts/2013-06-25-removing-turbolinks-from-rails-4) –

+0

只是从application.js文件中删除turbolinks使其工作 –

回答

17

解决了这个js文件从身体移动= javascript_include_tag "application", "data-turbolinks-track" => true对头,感谢你的帮助可能解决这个

+4

感谢您的咨询!帮助我很多,无法弄清楚什么是一个小时的问题! 真的应该在文档中的某个地方,通常建议在 – 2013-09-21 15:54:15

1

您可能遇到问题的一个可能原因是如果您在每个页面上包含js。这是我的理解,它会将js添加到头部,如果您已将它包含在多个页面中,则可能会发现多次绑定ajax。这就是说,你不知道你是如何包括我所看到的js。您可以通过只包括您的application.js

+0

我只在应用程序中包含js文件,所以我认为这可能不是原因,顺便说一下,视图代码在那里被包含为一个部分,这是否可能是原因? –

8

你可以把它留在体内,你只需要添加到您的脚本标签:

"data-turbolinks-eval" => false 

一般来说,turbolinks,最好确保你的代码是“幂等”,所以如果它运行不止一次,绑定不会得到建立不止一次。

做到这一点,最好的办法是,而不是$(“嗒嗒”)的bind()调用先解除。

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

之前移动脚本谢谢,解除绑定看起来很烦人 –

+0

是的。有一些复杂的插件可以尝试并解决它,但我发现unbind()更简单更有效,但它确实会添加一些难看的东西! – Kevin

+1

而不是解除绑定并重新绑定,最好是执行'$(document).on('click','.blah',function(e){});'。 –