我正在使用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结构是否可行。感谢。
答案 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
,而不替换任何其他规则。
希望现在很清楚。