2012-02-21 7 views
7

मान लें कि आप ब्लॉगर के लिए सॉफ़्टवेयर लिख रहे हैं।आप कैसे निपटते हैं: मूल ऑब्जेक्ट द्वारा परिभाषित कैनकन में अनुमति बनाएं?

प्रत्येक उपयोगकर्ता केवल ब्लॉग पोस्ट बना सकता है यदि वे ब्लॉग के स्वामी हैं। कैनकैन सामान्य रूप से के रूप में इस परिस्थिति में की क्षमता की जांच निर्धारित करना होगा:

user.can? :create, Post 

हालांकि उपयोगकर्ता केवल पोस्ट बना सकते हैं अगर वे मौजूदा ब्लॉग के मालिक हैं और वहाँ केवल अपनी classname का उपयोग कर मौजूदा ब्लॉग संदर्भित करने के लिए कोई रास्ता नहीं है। क्या मैं सच में ऐसा करने में सक्षम होने की जरूरत है है: कैनकैन परिभाषा में मैं कह सकता हूँ

user.can? :create, Post, @current_blog 

ऐसी है कि

can :create, Post do |post, blog| 
    user == blog.owner 
end 

कि संभव है या मुझे लगता है मैं यह कैसे आ रहा हूँ में भ्रमित कर रहा हूँ?

उत्तर

8

वर्तमान वस्तु की मूल के आधार पर एक क्षमता को परिभाषित करें कि वे एक मालिक हैं।

  • Post.blog_id का उपयोग करता
  • तुलना माता पिता Blog रिकॉर्ड को खोजने के लिए Blog.user_id क्षेत्र current_user.id क्षेत्र के लिए

यह भी सुनिश्चित करें कि आप एक :through घोषणा प्रयोग कर रहे हैं जब लोड हो रहा है और अपने पोस्ट संसाधन को अधिकृत करते हैं, तो कैनकैन जानता है अभिभावक रिकॉर्ड है।

PostsController: 

load_and_authorize_resource :through => :blog 

और अधिक विस्तार के लिए GitHub पर CanCan wiki देखें।

+1

द: through =>: अंत में ब्लॉग सौदा था। आपका बहुत बहुत धन्यवाद! – rfsbsb

0

आप

user.can उपयोग कर सकते हैं? : Create_posts,

या

user.can @current_blog: अद्यतन,

बजाय

user.can @current_blog? : बनाएं, पोस्ट करें, @current_blog

। बेशक, आपको शायद और createload_and_authorize_resource से कार्रवाई करने की आवश्यकता है। और परीक्षण "प्राधिकरण" अपने आप से

डीईएफ़ नई
अनधिकृत! अगर नहीं कर सकता :

can :create, Post, :blog => { :user => user } 

यह सुनिश्चित करें कि वर्तमान उपयोगकर्ता केवल एक ब्लॉग के लिए एक नई पोस्ट रिकॉर्ड बना सकते हैं कर देगा: create_posts, @current_blog
अंत

+0

क्या आप जानते हैं कि आप वास्तविक क्षमता परिभाषा के साथ कैसे निपटेंगे? यह आम तौर पर 'कर सकते हैं: पोस्ट करें | post_instance | ...' 'तो यह स्पष्ट नहीं है कि अलग-अलग चरों को कैसे पास करना है इसके साथ काम करेगा? –

+0

आपके उदाहरण के लिए मैं 'can (: create_posts, ब्लॉग) do | ब्लॉग का उपयोग करूंगा। उपयोगकर्ता == blog.owner end'। तो परीक्षण @current_blog पर पोस्ट नहीं किया गया है, लेकिन PostController.new में। – Foton

+0

मुझे यकीन नहीं है कि यह काम करेगा क्योंकि मेरा मानना ​​है कि कैनकन पारित ऑब्जेक्ट के प्रकार के आधार पर अनुमतियों को अनुक्रमित करता है ताकि यदि कोई 'ब्लॉग' में पारित हो, तो यह ब्लॉग अनुमतियों को देखेगा। अंत में जिस तरह से मैं इसे प्राप्त कर रहा हूं, वैसे ही एक नई वस्तु सेट करना है: 'user.can? : बनाएं, @ current_blog.posts.new' - इस तरह से मैं एक पोस्ट ऑब्जेक्ट में पास कर सकता हूं और अभी भी पेरेंट को –

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