2014-04-30 70 views
-1

我的應用程序中的問題可以提高。但是,點擊upvote按鈕後,頁面將重新加載。我搜索了四處,並找到了通過jQuery做到這一點的方法,所以頁面不會重新加載,但我無法讓它們工作(我是jQuery全新的)。請告訴我爲了完成這項工作我必須添加什麼。通過jQuery提交帖子

這裏是給予好評問題的鏈接:

<%= link_to "Upvote", upvote_comment_question_path(question.comment, question) %> 

這裏是在問題控制器給予好評方法(現在它重定向回同一頁):

def upvote 
    @question = Question.find params[:id] 
    @question.liked_by current_user 
    redirect_to post_comment_path(@question.comment.post, @question.comment) 
end 
+0

http://learn.jquery.com –

回答

1

所有你真的需要jQuery來更新頁面上的upvote count。按照慣例,鏈接使用GET方法,但是你正在修改某些東西,所以PUT就是你想要的動作。您可以修改link_to的方法,也可以使用button_to進行自定義操作。

確保您的路線反映正確的動作:

resources :questions do 
    member do 
    put 'update_votes' 
    end 
end 

你要開始與你的看法是這樣的。

<% @questions.each do |q| %> 
    <div id="<%= q.id %>"> 
     <%= link_to "Upvote", upvote_comment_question_path(q.comment, q), remote: true, method: :put %> 
     <div class="upvote-count"><%= q.upvote_count %></div> 
     <div class="question">Content</div><br /> 
    </div> 
<% end %> 

您的div需要一個ID,以便它在更新時可以位於最後。

remote: true link_to使用AJAX提交它,因此您的頁面不會刷新。那時,你不希望你的upvote動作在任何地方重定向,你希望它執行upvote.js.erb,這將是它的默認動作。修改控制器動作:

def upvote 
    @question = Question.find params[:id] 
    @question.liked_by current_user 
end 

upvote.js.erb將有機會獲得@question了,所以它只是需要做這樣的事情:

$("#<%= @question.id %> .upvote-count").html("<%= @question.likes %>"); 

這應該改變你給予好評計數的值以匹配新的價值。

+0

首先感謝您的詳細解答!我想我可能需要調整upvote.js.erb它的工作。 cached_votes_total我在那裏存儲投票,所以我替換了.upvote-count。但是,我是否將@ question.likes更改爲question.votes.size(顯示投票數)? – user2759575

+0

如果您熟悉,我正在使用acts_as_votable gem btw。 – user2759575

+0

@ user2759575只需將@ question.likes調整爲您用來顯示頁面上喜歡的數量的任何方法,聽起來像是@ question.cached_votes_total',如果它已經保存了數字。 '@ question.votes.size'會做同樣的事情,但這是一個更昂貴的查詢,所以如果可能的話,你應該使用緩存總數。 – subvertallchris