2012-08-01 11 views
6

मैंने डेविस और कैनकन के साथ एक रेल एप्लिकेशन शुरू कर दिया है। मेरे पास ऐसे उपयोगकर्ता हैं जिनके लेखों में से एक से अधिक संबंध हैं। मैं कैनकैन के लिए नया हूँ, यहाँ मैं क्या करने की योजना बना रहा हूँ है:कैनकन - उपयोगकर्ताओं को केवल अपनी ऑब्जेक्ट्स को अपडेट और हटाने की अनुमति कैसे दें

व्यवस्थापक

  • लेख

प्रवेश प्रयोक्ता से किसी भी कार्रवाई कर सकते हैं

  • लेख पढ़ और बना सकते हैं

अतिथि उपयोगकर्ता

  • संपादित कर सकते हैं और नष्ट अपने ही लेख लेख

पढ़ सकते हैं लेकिन मैं मुसीबत कैनकैन की वाक्य रचना को समझने आ रही है। मैं समझता हूं कि यह ऐसा कुछ होगा।

def initialize(user) 
    user ||= User.new 
    if user.admin? 
    can :manage, Article 
    else 
    can :read, Article 
    end 
end 

लेकिन यह सिर्फ व्यवस्थापक और अतिथि उपयोगकर्ता के लिए है, मुझे यकीन है कि उपयोगकर्ता में एक लॉग इन से एक अतिथि उपयोगकर्ता अंतर करने के लिए कैसे, क्योंकि यह एक नया उपयोगकर्ता वस्तु बनाता है जब उपयोगकर्ता खाली है नहीं कर रहा हूँ। मैंने देखा है कि कोड इस can [:edit, :destroy], Article, :user_id => user.id जैसा कुछ होना चाहिए, लेकिन मुझे यकीन नहीं है कि यह प्रारंभिक विधि में कैसे फिट होगा।

और एक आखिरी सवाल, यदि मैं केवल मेहमानों पर can :read, Article परिभाषित करता हूं, तो क्या यह अन्य क्रियाओं को ब्लॉक और अपडेट करता है, जैसे कि सफेद कार्रवाई को पढ़ने की कार्रवाई?

किसी भी मदद की सराहना की जाएगी। आपका बहुत बहुत धन्यवाद!

उत्तर

15

यहाँ मैं क्या किया है:

ability.rb

def initialize(user) 
    if user.nil? 
    can :read, Article 
    elsif user.admin? 
    can :manage, Article 
    else 
    can [:read, :create], Article 
    can [:update, :destroy], Article, :user_id => user.id 
    end 
end 

में और लिंक प्रदर्शित करने के लिए, मैं इस का उपयोग किया है:

- if can? :read, Article 
    = link_to 'Show', article 
- if can? :create, Article 
    = link_to 'New Article', new_article_path 
- if can? :update, article 
    = link_to 'Edit', edit_article_path(article) 
- if can? :destroy, article 
    = link_to 'Destroy', article, method: :delete, data: { confirm: 'Are you sure?' } 

और यह अब काम कर रहा है , यकीन नहीं है कि यह सबसे अच्छा तरीका है हालांकि।

+0

दृश्य अच्छा नहीं दिखता है, लेकिन यह प्रश्न विषय से संबंधित नहीं है, जो आपकी क्षमता में अच्छी तरह से कवर लगता है। आरबी। –

+0

मैं स्वयं निर्मित हेल्पर्स का उपयोग कर रहा हूं, जैसे link_to_edit, link_to_destroy, आदि। मेरे सहायक में कॉल करने के लिए कॉल शामिल हो सकता है?(), इसलिए तर्कों के अंदर तर्क डालने की कोई आवश्यकता नहीं है। –

8

आप शर्तों के हैश पारित कर सकते हैं: जानकारी के लिए https://github.com/ryanb/cancan/wiki/defining-abilities पर

can :manage, Article, :user_id => user.id 

देखो।

+0

मुझे इस टिप्पणी को एक ही समय में जोड़ा गया है @ mumble संपादित प्रश्न, और अभी प्रश्न में उत्तर शामिल है। –

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

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