我想缓存Post
视图中的字符串,但认为取决于当前用户的权限(例如,我只显示,如果current_user.can?(:edit, @post)
“编辑”链接)获取表示用户的康康舞能力
所以我希望我的缓存键包含当前用户CanCan能力的表示形式,以便在用户能力发生变化时使缓存失效
SO:如何获取表示当前用户能力的字符串,例如: 2个具有相同能力的不同用户会产生相同的“能力串”?
我试过user.ability.inspect
,但这不会产生谁拥有相同的能力
我想缓存Post
视图中的字符串,但认为取决于当前用户的权限(例如,我只显示,如果current_user.can?(:edit, @post)
“编辑”链接)获取表示用户的康康舞能力
所以我希望我的缓存键包含当前用户CanCan能力的表示形式,以便在用户能力发生变化时使缓存失效
SO:如何获取表示当前用户能力的字符串,例如: 2个具有相同能力的不同用户会产生相同的“能力串”?
我试过user.ability.inspect
,但这不会产生谁拥有相同的能力
编辑不同的用户相同的字符串:修订CanCanCan
由于CanCanCan的1.12版本( CanCan的社区延续),Ability.new(user).permissions
返回一个包含给定用户所有权限的散列。
以前的答案(康康舞):
这可能是一个有点复杂......但在这里不用..
如果通过指定用户到由惨惨,你所需要的能力模型可以访问使用instance_variable_get用户角色的定义,然后把它分解成任何字符串值,你从那里想..
>> u=User.new(:role=>"admin")
>> a=Ability.new(u)
>> a.instance_variable_get("@rules").collect{
|rule| rule.instance_variable_get("@actions").to_s
}
=> ["read", "manage", "update"]
,如果你想知道在这些规则是在模型在flicted,您可以访问@subjects实例变量来得到它的名字..
这里是能力模型结构,从我与(PP)
Ability:0x5b41dba @rules=[
#<CanCan::Rule:0xc114739
@actions=[:read],
@base_behavior=true,
@conditions={},
@match_all=false,
@block=nil,
@subjects=[
User(role: string)]>,
#<CanCan::Rule:0x7ec40b92
@actions=[:manage],
@base_behavior=true,
@conditions={},
@match_all=false,
@block=nil,
@subjects=[
Encounter(id: integer)]>,
#<CanCan::Rule:0x55bf110c
@actions=[:update],
@base_behavior=true,
@conditions={:id=>4},
@match_all=false,
@block=nil,
@subjects=[
User(role: string)]>
]
我想送我的能力的工作JS和后续的这篇文章,这里是我的助手方法,你可以用它来将你的用户能力转换为控制器中的数组。然后我在数组上调用.to_json并将其传递给javascript。
def ability_to_array(a)
a.instance_variable_get("@rules").collect{ |rule|
{
:subject => rule.instance_variable_get("@subjects").map { |s| s.name },
:actions => rule.instance_variable_get("@actions").map { |a| a.to_s }
}
}
end
下面是一个实现了CAN()方法我Backbone.js的模型:
var Abilities = Backbone.Model.extend({
can : function(action, subject)
{
return _.some(this.get("abilities"), function(a) {
if(_.contains(a["actions"], "manage") && _.contains(a["subject"], "all")) return true;
return _.contains(a["actions"], action) && _.contains(a["subject"], subject);
});
}
});
您也可以使用:subject => rule.instance_variable_get(“@ subjects”)。map {| s | s.to_s},就好像你使用s.name一样,你的主题包含符号会出错 – SteveA 2014-02-21 10:51:53
错过了赏金! :( – RGB 2012-04-16 13:28:01