【问题标题】:Pass Rails variable to AJAX call将 Rails 变量传递给 AJAX 调用
【发布时间】:2012-11-08 22:24:59
【问题描述】:

我想对产品评论实施 AJAX Upvote / Downvote(stackoverflow 风格)。

每条评论都会产生部分投票:

_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' %>");
});

所以当用户点击upvote时,部分会被重新渲染以显示新的投票数。

问题是,一个页面中有很多评论。在 AJAX 调用之后,JavaScript 不知道哪个评论的投票偏向于重新呈现。 ($('#vote_id???') 部分)

Rails 有没有办法将评论 ID 传递给 JavaScript?

或实现此功能的任何其他替代方案。

提前致谢!

【问题讨论】:

  • 您不需要将 upvote.js.erb 包装在准备好的文档中,因为在触发 AJAX 请求时该文档应该已经准备好了。
  • 请向我们展示upvote 操作的代码。理想情况下,您应该在其中定义一个 @review 变量,可以使用它。

标签: jquery ajax ruby-on-rails-3


【解决方案1】:

如果您在 upvote 操作中定义了 @review 变量,就像我猜想的那样,那么您可以这样做:

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

【讨论】:

  • 行得通!只是好奇-像这样传递变量是一种好习惯吗?还有,有没有更优雅的方式来实现这个投票功能?
  • 您实际上并没有在此处传递变量,您只是在使用通过请求提供给您的内容。请求路由到包含 review_id 的 URL,并且在您的控制器中,您将找到匹配的评论。像你一样使用它很好。
  • 如果在部分中定义了投票选择器,使用 jQuery 的replaceWith 而不是html 会很有帮助。虽然两者都很可能对用户有用,但使用 html 会留下额外的元素。
  • 因此,控制器中可用的任何内容都可以在 .js.erb 文件中使用。
  • 控制器动作中定义的任何实例变量在该动作呈现的任何模板(无论是视图还是部分)中都可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 2012-04-21
相关资源
最近更新 更多