2011-06-08 47 views
2

我一直在关注使用康康斯的Ryan Bates的railscast,但是我很难理解为什么检查一个用户是否写了一篇评论,然后让他们编辑它,如果他们有,就不会为我工作。如何让用户只更新他们使用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 %> 

感谢您的帮助!

回答

4

在你看来,你应该写类似

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

所以通过在实际审查对象,而不是仅仅类。

+1

感谢您的答案,它仍然没有使用'@review',但使用'审查'确实奏效。 – Dave 2011-06-08 12:33:15

1

尝试:

review.user_id == user.id 

相反的:

review.try(:user) == user 

你比较同一用户的两个不同的实例。这可能是使用user.object_id进行比较。 Rails 3.1通过使用ActiveRecord的标识映射来解决这个问题。

要确认:

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

我会避免使用块用于该用途的情况下,并使用惨惨的属性哈希方法代替:

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

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

相关问题