如何允许用户仅更新他们使用cancan编写的评论?

时间:2011-06-08 09:04:17

标签: ruby-on-rails cancan

我一直在跟踪Ryan Bates关于使用cancan的轨道广播,但我很难过为什么检查用户是否已经撰写评论,然后允许他们编辑它,如果他们有,不会为我工作。

继承我的代码:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.role == "admin"
      can :manage, :all
    else
      can :read, :all
      if user.role == "author"
        can :create, Review
        can :update, Review do |review|
          review.try(:user) == user
        end
      end
    end
  end
end

我希望作者只能更新他们撰写的评论,所有其他能力都能正常工作,但是作者可以更新每个人写的评论,我在这里缺少什么?

我使用该功能来决定是否在评论部分中显示编辑链接:

  <% if can? :update, Review %>
    testing
  <% end %>

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

在你看来,你应该写点像

<% if can? :update, @review %>
  testing
<% end %>

所以传递实际的review-object,而不仅仅是类。

答案 1 :(得分:1)

尝试:

review.user_id == user.id

而不是:

review.try(:user) == user

您正在比较同一用户的两个不同实例。这可能是使用user.object_id进行比较。 Rails 3.1通过使用ActiveRecord的身份映射来修复此问题。

确认:

user.find(1) == user.find(1)

答案 2 :(得分:0)

我会避免在此用例中使用块,而是使用CanCan的属性哈希方法:

if user.role == "author"
  can :create, Review
  can :update, Review, :user_id => user.id
end

这将基于用户ID而不是用户对象本身进行比较。