2013-08-05 148 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){});'。 –