使用CanCan限制关系中的项目数量

时间:2013-06-03 12:24:56

标签: ruby-on-rails cancan

Form belongs_to UserGroup。某些角色无法创建多个Form,每个UserGroup的类型为“improve_points”。我想用CanCan(1.6.x)实现这个。但是如何?

在我的观点和控制器中,我希望能够说:

link_to("New Form", new_form_path) if can? :create, Form, @user_group

或类似的任何内容,例如Form.new(:user_group => @user_group)

我的能力相关部分.rb:

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_coach?
      cannot :create, Form, :type => "improvement_points" do |form|
        # Allow no more than one Form per group.
        Form.where(:user_group_id => user_group.id).count > 0
      end
    end
  end
end

问题是我不知道如何传递上下文 user_group_id。我尝试Rianbs description on this,但这似乎不适用于我的情况,因为我需要专门检查要创建的项目数量。

cancan是否是正确的工具?我已经在Form model上进行了一些验证,以便在较低级别上执行每组一次的行为;我应该问Form模型而不是Ability?

1 个答案:

答案 0 :(得分:0)

也许cancan可以做到这一点,但感觉就像是在推动它。我只是将这个逻辑放在控制器中。

def create
  if condition_that_is_hard_to_write_in_ability_rb?
    raise CanCan::AccessDenied, "Helpful message about what to do instead"
  end
end