【问题标题】:Using Devise to check a resource against current_user使用 Devise 针对 current_user 检查资源
【发布时间】:2012-06-17 15:49:23
【问题描述】:

我正在使用 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),但我不确定这是否属于视图逻辑。

【问题讨论】:

    标签: ruby-on-rails-3 devise


    【解决方案1】:

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

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

    那么,在你看来,你可以把if post.voted?(current_user)

    你是对的,逻辑属于模型,模型不知道(也不应该)模型之外的任何东西,比如当前用户。您必须将其作为参数传入

    【讨论】:

    • 呃,回想起来这似乎很明显。谢谢贾斯汀。
    • 很高兴为您提供帮助。我只是做了一个小改动,因为按照惯例,方法以 ?应该返回一个布尔值。
    【解决方案2】:

    您有一个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
    

    【讨论】:

    • 嗯,以前从未尝试过,但这似乎是一种更好的方法。会试一试。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多