每个用户有一个角色的cancan:通过一系列条件语句累积定义角色?

时间:2011-08-16 16:31:53

标签: ruby-on-rails-3 cancan

我正在使用cancan,每个用户只有一个角色。角色是整数而不是字符串。我的能力.rb的组织方式如下:

def initialize(user, session)
    if user.role.to_i == 9
        can :create, [Resource1, Resource2, Resource3]
        can :update, [Resource1, Resource2, Resource3]
    elsif user.role.to_i == 8
        can :create, [Resource1, Resource2]
        can :update, [Resource1, Resource2]
    else
        can :create, Resource1
        can :update, Resource1
    end
end

实际上有7个角色而不是3个,文件要复杂得多。是否可以像这样重写文件,以便可以通过条件语句累积定义角色?

def initialize(user, session)
    if user.role.to_i >= 9
        can :create, Resource3
        can :update, Resource3
    end
    if user.role.to_i >= 8
        can :create, Resource2
        can :update, Resource2
    end
    can :create, Resource1
    can :update, Resource1
end

我想知道在重写整个文件之前,带条件语句的这个EXACT结构是否可行。感谢。

1 个答案:

答案 0 :(得分:1)

是(比较除外)。查看here,它会添加规则。

def can(action = nil, subject = nil, conditions = nil, &block)
  rules << Rule.new(true, action, subject, conditions, block)
end

编辑:如果它可能有用。

def initialize(user, session)
  resources = [Resource1]
  resources << Resource2 if user.role.to_i >= 8
  resources << Resource2 if user.role.to_i >= 9
  can :create, resources
  can :update, resources
end

编辑2:

第一部分是什么意思?

首先,抱歉粘贴错误的代码块。然后,您可以看到您正在添加一个新规则,其主题是您传递给can的规则。在Rule initializer中,您可以看到以下行:

@subjects = [subject].flatten

这意味着如果你有一个数组,你仍然拥有那个数组(这就是flatten的用途),但是如果你只有一个资源就可以得到一个单项数组。您可以在代码中挖掘更多内容,您会注意到,只有一个资源的规则只有一个规则。

然后将此规则添加到rules,而不替换任何其他规则。

希望现在很清楚。