是否可以在CanCan中调用另一个类实例?

时间:2012-03-08 12:17:51

标签: ruby-on-rails cancan

问题是我有两个模型 - 项目和故障单(属于项目)。我希望在项目到期时拒绝创建故障单(即我希望用户无法为过期项目创建新故障单)。

如何拒绝在CanCan Ability中为用户创建故障单? 像

这样的东西
if user.role? :superuser
  can :read, :all
  can :create, Ticket do |ticket|
    ticket.project.expired?
  end
end

问题是“项目”方法没有在任何地方定义。 我非常感谢你的帮助。

1 个答案:

答案 0 :(得分: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