2009-03-23 15 views
10

मैं इस तरह अपने आवेदन नियंत्रक में एक before_filter विधि बनाना चाहते हैं ...मैं फ़िल्टर से पहले पैरामीटर कैसे भेज सकता हूं?

def check_role(role_name) 
    unless logged_in_user.has_role? role_name 
    flash[:notice] = 'Access to that area requires additional privileges.' 
    redirect_to :back 
    end 
end 

हालांकि, यह के रूप में यद्यपि से पहले फिल्टर मापदंडों ले जा सकते हैं नहीं लगती है।

क्या इस कॉल को पैरामीटर करने का कोई तरीका है, या क्या मैं हथौड़ा के साथ एक स्क्रू ड्राइव करने की कोशिश कर रहा हूं?

उत्तर

18

आपको ब्लॉक के साथ ऐसा करने में सक्षम होना चाहिए:

before_filter {|controller| controller.check_role('admin') } 
+0

कहाँ "नियंत्रक" का मान सेट करने के परम करता पाया जा सकता है? – Ethan

+1

पहले_फिल्टर ब्लॉक पर नियंत्रक ऑब्जेक्ट उत्पन्न करेगा। यदि आप रुबी के ब्लॉक प्रारूप से परिचित नहीं हैं, तो पाइप (यानी ||) ब्लॉक को पारित पैरामीटर को सीमित कर देता है। (एफवाईआई, आप यहां जो कुछ भी चाहते हैं उस पैरामीटर का नाम दे सकते हैं; मैंने इसे "नियंत्रक" नाम दिया है जो कि क्या हो रहा है, इस पर स्पष्ट होना चाहिए) –

+0

यह काम करता है। धन्यवाद। मॉड्यूल नाम – Ethan

3

मुझे विश्वास नहीं है कि आप फ़िल्टर करने के लिए पैरामीटर पास कर सकते हैं। तो मैंने अतीत में जो किया है, वह स्थिर विधियों को बना देता है जो पैरामीटर को उस विधि को पास करते हैं जिस पर पैराम की आवश्यकता होती है।

before_filter :check_admin_role 

संभवतः है मेटा प्रोग्रामिंग के साथ इस लागू करने के लिए किसी तरह

def check_role(role_name) 
    unless logged_in_user.has_role? role_name 
    flash[:notice] = 'Access to that area requires additional privileges.' 
    redirect_to :back 
    end 
end 

def check_admin_role 
    check_role('admin') 
end 

def check_blah_role 
    check_role('blah') 
end 

फिर अपने नियंत्रक में आप सिर्फ फोन हैं, लेकिन मैं कर रहा हूँ:

तो मैं कुछ इस तरह होता है अभी भी काफी n00b और अभी तक उस भाग को नहीं मिला है;)

4

आप थोड़ा मेटा प्रोग्रामिंग का उपयोग कर सकते हैं।

Module RoleWithIt 
    Role.all.each do |role| 
    define_method("check_#{role.name}_role".to_sym) do 
     check_role(role.name) 
    end 
    end 

    def check_role(role_name) 
    return if logged_in_user.has_role?(role_name) 
    flash[:notice] = 'Access to that area requires additional privileges.' 
    redirect_to :back 
    end 
end 

ApplicationController.send :include, RoleWithIt 

इसे लोड होगा कि आपका ऐप्लिकेशन initialises, बस एक फ़ाइल बुलाया role_with_it.rb में रख और डाल दिया है करने के लिए: कुछ इस तरह (पूरी तरह से अपरीक्षित, बस कुछ आप यह कैसे जा सकते हैं की एक विचार देने के लिए) आपकी lib निर्देशिका में।

+2

+1 धन्यवाद, यह भी एक अच्छा समाधान है। मुझे पैराम्स के बारे में पता नहीं था [: कार्रवाई]। – vrish88

4

क्या मैं हथौड़ा के साथ एक स्क्रू ड्राइव करने की कोशिश कर रहा हूं?

एर, संभवतः ;-)

यदि मैं यह सही ढंग से पढ़ रहा हूँ, तुम एक स्थिति एक नियंत्रक के अंतर्गत गतिविधियों को विभिन्न पहुँच स्तर है जहां है, तो आप एक ही चैक बनाकर दोहराव निकालना चाहते हैं समारोह?

तो आप ऐसा कुछ करने के लिए देख रहे हैं?

before_filter :check_role('admin'), :only => [:admin, :debug] 
before_filter :check_role('power'), :only => [:edit, :delete] 

लेकिन माता-पिता की चीज़ में पैरामीटर कानूनी नहीं है। और वैसे भी, मैं अभी भी डुप्लिकेशंस का एक उचित बिट देखता हूं!

सामान्य रूप से, कार्यक्षमता के क्षेत्र के साथ-साथ नियंत्रक फ़िल्टर के रूप में भी जाना जाता है, यदि आप कुछ नहीं कर सकते हैं, तो संभवतः क्योंकि आप कुछ गलत तरीके से देख रहे हैं। (याद रखें कि रेल को खुद को "रायषित सॉफ़्टवेयर" के रूप में वर्णित करने पर गर्व है!)

यदि आप अपनी फ़िल्टर विधि में कार्रवाई का नाम जान सकें तो यह कैसा होगा?

फिर हम

before_filter :check_role 

कौन सा सुंदर DRY है होगा।

हम एक हैश में अनुमतियाँ निर्धारित कर सकते हैं, शायद:

Perms = { :admin => ['admin'], :edit => ['admin', 'power'], etc 

... जो दोहराव के विशिष्ट तत्वों को संपुटित करने लगते हैं। यदि यह जटिल हो गया है तो पूरी चीज एक टेबल में जा सकती है, हालांकि आप प्लगइन में पहले से ही उपलब्ध कार्यक्षमता को डुप्लिकेट कर रहे हैं।

और हम होगा

protected 
def check_role 
    for required_role in Perms[params[:action]] 
    return if logged_in_user.has_role? required_role 
    end 
    flash[:notice] = 'Access to that area requires additional privileges.' 
    redirect_to :back 
end 

या कुछ इसी तरह की। पैराम्स [: एक्शन] मेरे वर्तमान रेल संस्करण (2.1.2) पर काम करता है, हालांकि रेल बुक (v2) action_name विधि का उल्लेख करता है जो मेरे लिए खाली लौटता प्रतीत होता है।

+0

के लिए – Ethan

+0

(ईमानदार होने के लिए, मुझे कुछ खोदना भी था!) –

0

यह एक पुराने सवाल है, लेकिन अगर किसी को अभी भी चमत्कार, रेल 4 के लिए एक अच्छा asnwer here

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