使用Devise根据current_user检查资源

时间:2012-06-17 02:31:45

标签: ruby-on-rails-3 devise

我正在使用Rails 3和Devise 2.0

在Posts资源的索引视图中,我想显示一个投票按钮,除非current_user已经投票。

我只将@posts = Post.all传递到索引视图中。检查每个帖子以查看current_user是否已经投票并相应地呈现视图的最佳方法是什么?

我目前正在尝试通过在Post模型中使用voted?方法来实现此目的,但是current_user方法在那里不可用。

我看到的另一个解决方案是在索引视图中有if letter.votes.find_by_user_id(current_user.id),但我不确定它是否属于视图逻辑。

2 个答案:

答案 0 :(得分:3)

一个好的解决方案是在Post模型或帮助器中实现一个方法,如下所示(假设发布了has_many票):

def voted?(user)
  !votes.find_by_user_id(user.id).empty?
end

然后,在您的视图中,您可以放置​​if post.voted?(current_user)

你是对的,逻辑属于模型,模型对模型之外的任何东西都没有任何知识(也不应该),例如当前用户。你必须把它作为一个参数传递

答案 1 :(得分:1)

您有PostVoteUser型号

并且您想知道帖子何时有来自特定用户的投票

一种方法可能是Justin的方法,但这会产生太多的数据库查询而不是需要

更好的解决方案是使用这样的has_many :through关联:

class Post
  has_many :votes
  has_many :voted_users, through: :votes, source: :user
end

现在你可以拨打@posts = Post.includes(:voted_users)

这会急切加载每个帖子上投票的所有用户

你可以说

if post.voted_users.include? current_user
  #do stuff
end