2012-11-08 232 views
2

我想在產品(stackoverflow樣式)的評論上實現AJAX Upvote/Downvote。將Rails變量傳遞給AJAX調用

我每次審查產生的部分投票:

_vote.html.erb

<div id="vote_<%= review.id %>" class="vote"> 

     <%= link_to 'Vote Up', upvote_kata_review_path(@product, @review), :class => "upvote", :method => :post, :remote => true %> 

     <span><%= review.plusminus %></span> <!--show the current vote--> 

     <%= link_to 'Vote Down', downvote_kata_review_path(@product, @review), :class => "downvote", :method => :post, :remote => true %> 

    </div> 

和upvote.js.erb

$(document).ready(function(){ 
    $('#vote_id???').html("<%= escape_javascript render :partial => 'votes/vote' %>"); 
}); 

所以,當用戶點擊給予好評,該部分將被重新渲染以顯示新的投票計數。

問題是,頁面中有很多評論。在AJAX調用之後,JavaScript不知道哪個評論的投票偏重於重新呈現。 ($('#vote_id ???')部分)

Rails是否有任何方式將評論ID傳遞給JavaScript?

或實現此功能的任何其他替代方法。

在此先感謝!

+0

你並不需要準備一個文件包upvote.js.erb ,因爲在AJAX請求觸發時文檔應該已經準備就緒。 –

+0

請向我們展示upvote操作的代碼。理想情況下,應該在其中定義一個'@ review'變量,可以使用它。 –

回答

4

如果你有在upvote動作定義,就像我懷疑你可能在@review變量,那麼你可以這樣做:

$('#vote_<%= @review.id %>').html("<%= escape_javascript render :partial => 'votes/vote' %>"); 
+0

這工作!只是好奇 - 這是一個很好的做法,像這樣傳遞變量?而且,是否有一種更優雅的方式來實現這種投票功能? – lakeskysea

+1

你並不是真的在這裏傳遞一個變量,你只是通過請求使用可用的東西。請求路由到包含'review_id'的URL,並在您的控制器內找到匹配的評論。像你一樣使用它很好。 –

+0

如果投票選擇器是在partial中定義的,那麼使用jQuery的'replaceWith'而不是'html'會很有幫助。雖然兩者都很可能爲用戶工作,但使用'html'會留下額外的元素。 – crftr