2013-08-21 13 views
10

में मॉड्यूलर सहायक बनाने के लिए मैं इस तरह है कि एक module.method के रूप में कहा जा सकता है, कुछ (कारण समूहीकरण के लिए) एक मॉड्यूल के अंदर एक विधि बनाना चाहते हैं:कैसे सिनात्रा

helpers do 
    module UserSession 
    def logged_in? 
     not session[:email].nil? 
    end 
    def logout! 
     session[:email] = nil 
    end 
    end 
end 

लेकिन यह कॉल करने के लिए जब मैं कोशिश UserSession.logged_in? का उपयोग करके यह कहा गया है कि log_in उपयोगकर्ता सत्र की विधि नहीं है

अपरिभाषित विधि 'log_in?' UserSession के लिए: मॉड्यूल

जब मैं UserSession के तरीके के रूप में विधि के लिए कदम:

helpers do 
    module UserSession 
    def self.logged_in? 
     not session[:email].nil? # error 
    end 
    def self.logout! 
     session[:email] = nil 
    end 
    end 
end 

यह एक त्रुटि देता है, कि मैं session चर

अपरिभाषित स्थानीय चर या विधि उपयोग नहीं कर सका उपयोगकर्ता सत्र के लिए 'सत्र': मॉड्यूल

सबसे अच्छा समाधान क्या है इस समस्या के लिए एन?

+0

'उपयोगकर्ता सत्र' शामिल है? – shime

+0

तो, क्या आप यह कह रहे हैं कि मुझे सिनात्रा की हेल्पर्स विधि के बाहर मॉड्यूल बनाना चाहिए, फिर इसे शामिल करें? इसमें एक ही समस्या होगी (सत्र चर का उपयोग नहीं कर सकता) – Kokizzu

उत्तर

5

आप helpers विधि के लिए एक अलग सम्मेलन का उपयोग कर सकते हैं।

module UserSession 
    def logged_in? 
    not session[:email].nil? 
    end 
    def logout! 
    session[:email] = nil 
    end 
end 

helpers UserSession 

get '/foo' do 
    if logged_in? 
    'Hello you!' 
    else 
    'Do I know you?' 
    end 
end 

मॉड्यूल परिभाषा निश्चित रूप से एक और (require घ) फ़ाइल में हो सकता है।

दृश्यों के पीछे, helpers <Module>include कर रहा है, लेकिन केवल आपके ऐप के लिए उपयोग किए जाने वाले सिनात्रा एप्लिकेशन उप-वर्ग में नहीं है। include को get, post आदि के साथ संगत बनाने की आवश्यकता है, उनके जादू का काम करें, और helpers आपके लिए यह करता है।

+0

नहीं, मैं विधि को मॉड्यूल नाम के साथ भी कॉल करना चाहता हूं .. 'UserSession.logged_in?' – Kokizzu

+1

@Kokizzu: यह संभव हो सकता है, लेकिन मुझे यकीन नहीं है कि कैसे सिनात्रा ढांचा। विधि को अनुरोध की स्थिति तक पहुंच की आवश्यकता है। –

+0

@ कोकिज़ू "मैं मॉड्यूल नाम के साथ भी विधि को कॉल करना चाहता हूं .. UserSession.logged_in?" - क्यूं कर? – iain

2

कोई बात नहीं, मैं इस सवाल का जवाब, मैं define_method('UserSession.logged_in?') भी कोशिश की है, लेकिन कोई भाग्य पाया

आखिरी बात मैं कोशिश की है है:

# outside helpers 
class UserSession 
    @@session = nil 
    def initialize session 
    @@session ||= session 
    end 
    def self.check 
    throw('must be initialized first') if @@session.nil? 
    end 
    def self.logged_in? 
    self.check 
    not @@session[:email].nil? 
    end 
    def self.logout 
    self.check 
    @@session.delete :email 
    end 
end 

लेकिन कुछ पहले बुलाया जाना चाहिए

before // do 
    UserSession.new session 
end 

तो इसे वांछित के रूप में उपयोग किया जा सकता है:

get '/' do 
    if UserSession.logged_in? 
    # do something here 
    end 
end 
+1

यदि यह सुरक्षा या स्वामित्व कोड में हुक होने का इरादा है, तो आपको संभवतः '// // // ब्लॉक भी जोड़ना चाहिए जो साफ़ करता है संग्रहीत सत्र चर। अन्यथा यह उसी प्रक्रिया पर अगले अनुरोध में अच्छी तरह से जारी रह सकता है (यहां साधारण मामले में जो हानिकारक होगा, और अगले अनुरोध पर ओवर-लिखित होगा, लेकिन यह डेटा के जोखिम भरा टुकड़ा है जो आसपास लटक रहा है)। –

+0

हाँ, यह वास्तव में एक समस्या है .. जब मैं एक बार में दो अनुरोध करता हूं, तो यह दिखाता है कि पुराना स्थैतिक चर अभी तक मिटा नहीं गया है ..> ___ < – Kokizzu

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