Ruby on Rails上的投票更新

时间:2010-09-03 20:22:16

标签: ruby-on-rails ruby voting-system

现在,我正在Ruby on Rails上构建一个社交媒体应用程序,我已经实现了一个5点投票系统。你可以在1-5的位置投票给网站上发布的新闻,我想知道的是,处理投票系统更新的最佳方法是什么。

在示例中。如果用户已经在一篇文章中投票,我想带回他在文章中给出的分数并软锁定投票(因为我只允许每个用户投1票,我允许随时更改您的投票),但是如果他不会在0投票时提出这篇文章。

我知道一种方法可以实现这一点,我可以在视图中执行此操作,并检查当前用户是否已经对此文章进行了投票,我将其发送到EDIT视图,否则发送到SHOW视图。 (我认为)

无论如何,这样做的“正确”方法是什么?

编辑:我忘了说投票组合框是我正在呈现的部分内容。我想只是以某种方式更新部分?

EDIT2:

class Article < ActiveRecord::Base

  has_many :votes
  belongs_to :user

  named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?",  user]}  }
end

class User < ActiveRecord::Base
  has_many :articles
  has_many :votes, :dependent => :destroy

  def can_vote_on?(article)
    Article.voted_by(current_user).include?(article) #Article.voted_by(@user).include?(article)
  end

end

1 个答案:

答案 0 :(得分:1)

如果用户可以对文章进行投票,请在用户模型中创建一个响应true的方法:

class User < ActiveRecord::Base

...

def can_vote_on?(article)
  articles_voted_on.include?(article) # left as an exercise for the reader...
end

end

在视图中,如果用户可以编辑,则渲染表单,否则渲染普通视图:

<% if @user.can_vote_on?(@article) %>
  <%= render :partial => "vote_form" %>
<% else %>
  <%= render :partial => "vote_display" %>
<% end %>

或者你可以在控制器中处理整个事情,并为表单版本和普通版本呈现单独的模板。最好的方法取决于您的具体情况。

<强> EDIT2

正如您所发现的,current_user在模型中不起作用。这是有道理的,因为可以从没有会话概念的迁移,库等中调用它。

无论如何都不需要访问当前用户,因为您的实例方法是(根据定义)在实例上调用。只需参考模型中的self,然后从current_user上的视图调用该方法,该视图是用户的实例:

(在模型中)

  def can_vote_on?(article)
    Article.voted_by(self).include?(article)
  end

(在视图中)

<% if current_user.can_vote_on?(@article) %>

如果控制器指定了@user,您可以将current_user替换为user.id

最后一件事,我认为您的命名范围应该使用named_scope :voted_by, lambda {|user| {:joins => :votes, :conditions => ["votes.user_id = ?", user.id]} } ,如下所示:

{{1}}