2012-03-21 15 views
7

मैं एक Post दृश्य कैश करने के लिए चाहते हैं का प्रतिनिधित्व करता हो जाओ, लेकिन दृश्य वर्तमान उपयोगकर्ता की अनुमतियों को (जैसे, मैं सिर्फ अगर current_user.can?(:edit, @post) "संपादित करें" लिंक दिखाई देते हैं)एक स्ट्रिंग, जो उपयोगकर्ता की कैनकैन क्षमताओं

तो पर निर्भर करता है मैं अपने कैश कुंजी को वर्तमान उपयोगकर्ता की कैनकन क्षमताओं का प्रतिनिधित्व शामिल करना चाहता हूं, ताकि जब उपयोगकर्ता की क्षमताओं में परिवर्तन हो तो मैं कैश को अमान्य कर सकता हूं

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

संपादित करें, जो अलग-अलग उपयोगकर्ताओं के लिए एक ही स्ट्रिंग का उत्पादन नहीं करता: CanCanCan

के लिए संशोधित CanCanCan के संस्करण 1.12 के रूप में (कैनकन की सामुदायिक निरंतरता), 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 उदाहरण चर का उपयोग कर सकते ..

यहाँ है जहाँ से मैं (पीपी)

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

यह एकमात्र चीज है जिस पर यह निर्भर करता है कि उपयोगकर्ता कैनकन मणि का उपयोग कर रहा है, जो ओपी का उपयोग कर रहा है। कैनकन – RGB

5

मैं अपने क्षमताओं भेजना चाहते थे के साथ काम किया की क्षमता के लिए मॉडल लेआउट है जेएस, और इस पोस्ट पर अनुवर्ती करने के लिए, यहां मेरी सहायक विधि है जिसका उपयोग आप अपने उपयोगकर्ता क्षमताओं को अपने नियंत्रक में एक सरणी में बदलने के लिए कर सकते हैं। मैं फिर सरणी पर .to_json को जावास्क्रिप्ट को पास करता हूं।

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")। मानचित्र {| s | s.to_s}, जैसे कि आप s.name का उपयोग करते हैं और आपके विषय में प्रतीक हैं, यह त्रुटि होगी – SteveA

संबंधित मुद्दे