我正在使用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)
,但我不确定它是否属于视图逻辑。
答案 0 :(得分:3)
一个好的解决方案是在Post
模型或帮助器中实现一个方法,如下所示(假设发布了has_many票):
def voted?(user)
!votes.find_by_user_id(user.id).empty?
end
然后,在您的视图中,您可以放置if post.voted?(current_user)
你是对的,逻辑属于模型,模型对模型之外的任何东西都没有任何知识(也不应该),例如当前用户。你必须把它作为一个参数传递
答案 1 :(得分:1)
您有Post
,Vote
和User
型号
并且您想知道帖子何时有来自特定用户的投票
一种方法可能是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