【问题标题】:Ajax voting methods in Ruby on RailsRuby on Rails 中的 Ajax 投票方法
【发布时间】:2011-03-17 20:02:11
【问题描述】:

所以我开发了模型关联和计数器缓存列,如这里的第一个答案所示:Model association question

现在我想知道,在创建两个按钮后,一个用于赞成和反对,以及显示票数的计数器缓存:<%= pluralize video.video_votes.size, 'vote' %> 我应该如何创建控制器方法/s 以便投票计数将增加 1 或减少 1?我很确定我自己可以弄清楚 AJAX 部分,所以我主要对最初将其作为普通 HTTP 请求执行此操作感到好奇。 (当然,我也不介意在 AJAX 方面提供帮助......)

【问题讨论】:

  • 实际上不赞成 counter_cache 用法

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


【解决方案1】:

控制器

class VideoVotes < ApplicationController
  ...
  def create
    @vote = VideoVote.new(params[:video_vote])
    @vote.user = current_user
    @vote.save
  end

  # OR if you want

  def create
    # you can use params[:video_id] instead of params[:video_vote][:video_id]
    # but you should specify it in your view
    @video = Video.find(params[:video_vote][:video_id])
    @vote = @video.video_votes.new
    @vote.user = current_user
    @vote.save
  end
  ..
end

AJAX 魔法,/app/viwes/video_votes/create.js.erb
我将为此使用 jQuery,因此请查看如何安装它

$("#votes").html("Votes: <%= @vote.video.video_votes.size %>")
# or with @video variable
$("#votes").html("Votes: <%= @video.video_votes.size %>")

查看:

<%= @video.description or whatever %>
<p id='votes'>Votes: <%= @video.video_votes.size %></p>
<p><%= link_to "+1", video_votes_path('video_vote[video_id]' => @video.id), :method => :post, :remote => true %></p>

就是这样。这里可能有一些错误

【讨论】:

  • 视频 has_many video_votes 这个事实怎么样?必须是@vote = @video.video_votes.new(params[:video_vote]吗?
  • 或者在 create.js.erb 中处理了吗?
  • 这是一回事。你可以像@video = Video.find params[:video_vote][:video_id]; @vote = @video.video_votes.new;那样做我展示的方式
  • 假设我也想要一个投票按钮和方法。我该怎么做?
  • 所以 counter_cache 不是你需要的东西 :)
【解决方案2】:

计数器缓存在以下情况下递增 此类的一个对象被创建并且 销毁时递减。

来自ruby on rails api

更新

@video = Video.find(params[:id])
@video.increment!(:votes_count)
#or
@video.decrement!(:votes_count)

【讨论】:

  • 计数器缓存通常用于对现有子对象进行计数。但是你总是可以使用 decrement_counter 方法
  • 这更像是一个 hack,因为 @video.video_votes.count 将不同于 @video.video_votes.size。不好
  • 我更新了答案。我同意他不需要计数器缓存。
  • 如果我不使用计数器缓存,那我就不必像.count 那样做一些会损害性能的事情吗?
  • 当然使用计数会降低应用程序的性能。我说的是不要使用 counter_cache 魔法。使用我上面发布的方法增加或减少您想要的列。您可以随时更新列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多