2012-03-21 2 views
7

私はPostビューをキャッシュしたいのですが、ビューは、現在のユーザーの権限に依存します(current_user.can?(:edit, @post)場合例えば、私は唯一の「編集」リンクを表示)だから、ユーザーのカンカン能力を表す文字列

を取得現在のユーザーのCanCan機能の表現をキャッシュキーに含めて、ユーザーの能力が変更されたときにキャッシュを無効にできるようにします。

SO:どのようにして現在のユーザーの能力を表す文字列を取得できますか同じ能力を持つ2人の異なるユーザーが同じ「能力文字列」を生成しますか?

私はuser.ability.inspectを試してみたが、これは同じ能力

+0

は、その恵みを逃した:

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 

そして、ここでは、缶()メソッドを実装して、私のBACKBONE.JSモデルです! : – RGB

答えて

7

EDIT持つ異なるユーザに同じ文字列を生成しません:CanCanCanのバージョン1.12のとおりCanCanCan

のために改訂されました( CanCanのコミュニティ継続)、Ability.new(user).permissionsは、指定されたユーザーのすべての権限を持つハッシュを返します。

前の回答(カンカン):

これは少し複雑かもしれません...しかし、ここではそれが行く..

あなたはカンカンで必要とされる能力モデルに指定されたユーザーを渡す場合は、あなたはこれらのルールはでされたモデルをお知りになりたい場合は

...
>> 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"] 

をinstance_variable_getを使用して、そのユーザの役割の定義にアクセスして、そこから好きな文字列値にそれを打破することができます時flicted、あなたはここで

は、私は私が自分の能力を送信したい

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)]> 
] 
+0

私はそれを要約すると、選択した内容の配列を構築して保存し、to_sを使ってその内容を文字列に変換する必要があります:) – RGB

+0

これは依存するハックです実装の詳細。 – tmandry

+0

これは頼りになるのは、ユーザーがCanが使用しているCanCanの宝石を使用しているということだけです。 AbCityおよびUserクラスはCanCanを使用するときに本来利用可能です – RGB

5

(PP)と協力し、そこから能力のモデルレイアウト..ですその名を取得するために@subjectsインスタンス変数にアクセスすることができますJSと、このポストをフォローアップするために、あなたのユーザー能力をコントローラの配列に変換するために使用できるヘルパーメソッドがあります。私は配列の上の.to_jsonをjavascriptに渡します。

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); 
    }); 
    } 
}); 
+0

また、次のものを使用することもできます:subject => rule.instance_variable_get( "@ subjects")。map {| s | s.nameを使用していて、件名にシンボルが含まれているかのように、エラーになります – SteveA

関連する問題