6

के लिए एकाधिक से पहले_फिल्टर स्टेटमेंट्स मेरे पास एक समूह संसाधन है जिसे मैं उचित प्राधिकरणों के साथ स्थापित करने का प्रयास कर रहा हूं।correct_user और admin

प्राधिकरण तर्क मैं लागू करने के लिए कोशिश कर रहा हूँ यह है:

  1. केवल समूह के सदस्यों को उनके समूह को देखने के लिए सक्षम होना चाहिए।
  2. कोई व्यवस्थापक किसी भी समूह को देख सकता है, साथ ही अन्य कार्रवाइयां भी ले सकता है।

मैं समूह नियंत्रक में निम्नलिखित before_filter बयान के साथ यह करने के लिए प्रयास कर रहा हूँ:

before_filter :signed_in_user 
before_filter :correct_user, only: :show 
before_filter :admin_user, only: [:show, :index, :edit, :update, :destroy] 

Correct_user काम करता है के रूप में मैं सत्यापित किया है कि केवल समूह के सदस्यों को उनके समूह को देख सकता। हालांकि, मैं जो करना चाहता हूं वह व्यवस्थापक के लिए है: इसे ओवरराइड करने के लिए खंड दिखाएं, ताकि कोई भी समूह किसी भी समूह को देख सके। वर्तमान में यह काम नहीं कर रहा है। मुझे लगता है कि मेरे फ़िल्टर ऑर्डरिंग और विकल्पों के साथ यहां कुछ गड़बड़ है।

क्या कोई मुझे बता सकता है कि मैं गलत कहां गया हूं?

संपादित

अमर के अनुरोध के अनुसार मेरी विधि कोड जोड़ना:

private 

def correct_user 
    # User has to be a member to view 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? 
end 

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 
+0

कोशिश admin_user व्यवस्थापक उपयोगकर्ता और अन्य – Amar

+0

धन्यवाद अमर के लिए सशर्त बनाते हैं। मैंने admin_user फ़िल्टर को correct_user से ऊपर डालने का प्रयास किया लेकिन उसने इसे ठीक नहीं किया। मैं इस स्थिति को कार्रवाई में डाल सकता हूं लेकिन देखना चाहता हूं कि पहले_फिल्टर के साथ ऐसा करने का कोई तरीका है या नहीं। – pejmanjohn

+0

फ़िल्टर के ऊपर लिखे गए तरीके से आगे के निरीक्षण पर उपयोगकर्ता को समूह देखने के लिए उपयोगकर्ता और व्यवस्थापक और एक सही_यूसर होना आवश्यक है। मैं चाहता हूं कि यह हो या – pejmanjohn

उत्तर

2

अद्यतन correct_user विधि या निम्नलिखित परिभाषा के साथ एक और तरीका बनाने, अन्य फिल्टर से शो को हटाने और नई विधि के साथ before_filter जोड़ने । correct_user ऊपर या दिखाने कार्रवाई में फिल्टर से पहले

def correct_user 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? && !current_user.admin? 
end 
+0

बना सकते हैं बस परीक्षण किया गया और यह बहुत अच्छा काम करता है। मुझे बुलियन कथन के बीच एक "&&" जोड़ने की आवश्यकता थी। – pejmanjohn