我一直在跟踪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 %>
感谢您的帮助!
答案 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而不是用户对象本身进行比较。