2012-11-08 160 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