2012-03-08 162 views
0

问题是我有两个模型 - 项目和票务(属于项目)。我想在项目过期时拒绝创建票据(即,我希望用户无法为过期的项目创建新票证)。可以在CanCan中调用其他类实例吗?

如何拒绝为CanCan能力中的用户创建票证? 喜欢的东西

if user.role? :superuser 
    can :read, :all 
    can :create, Ticket do |ticket| 
    ticket.project.expired? 
    end 
end 

的问题是“项目”的方法不被任何定义。 我非常感谢一些帮助。

回答

2

您只需在授予权限之前测试潜在故障单的项目是否已过期。关键在于许可是针对项目授予的,而不是门票。

对于这个我可能会定义一个特殊的能力...

if user.role? :superuser 
    can :read, :all 
    can :create_ticket_for_project, Project do |project| 
    !project.expired? 
    end 
end 

然后使用在你的控制器:

authorize! :create_ticket_for_project, @project 
+0

这实际上解决了我的问题。非常感谢。我不认为CanCan能力中的行动可以与控制器中的行动命名不同。 – 2012-03-08 14:56:05

相关问题