现在,我正在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
答案 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}}