2011-03-04 5 views
5

मैं रेल 3 पर रूबी का उपयोग कर रहा हूं और मैं बाद में नियंत्रकों में एक परिवर्तनीय @variable_name सुलभ सेट करने के लिए मध्यवर्ती उपयोग करने का प्रयास कर रहा हूं।एक मिडलवेयर में कैसे सेट करें मेरे सभी एप्लिकेशन में एक परिवर्तनीय सुलभ?

उदाहरण के लिए मेरी मिडलवेयर

class Auth 

    def initialize(app) 
     @app = app 
    end 

    def call(env) 
     @account ||= Account.find(1) 

     @app.call(env) 
    end 
    end 

ऊपर ठीक से सेट @account चर कोड है, लेकिन यह नहीं (, नियंत्रक, मॉडल, विचारों में ...) अपने आवेदन में उपलब्ध है। तो, मैं इसे कैसे पूरा कर सकता हूं?


मैं this answer कि मैं क्या जरूरत है ऐसा करने के लिए एक रास्ता है देखा है, लेकिन मैं @account चर "सीधे पहुँचा जा सकता है" करना चाहते हैं। यही कारण है, उपयोग के बिना इस तरह से है, लेकिन है कि उपलब्ध है, मेरे विचार में, बनाने उदाहरण के लिए इस तरह:

<%= debug @account %> 
+1

मुझे नहीं लगता कि यह मिडलवेयर में किया जा सकता है। क्या आपने 'applicationController' में' pre_filter: set_my_var' के साथ इसे आजमाया था? – Wukerplank

+0

@Wukerplank मुझे इसे एक मिडलवेयर में चाहिए। – user502052

+1

आप कुछ थ्रेड और संभावित हानिकारक कोशिश कर सकते हैं जैसे इसे 'थ्रेड.current [: my_var] = account.find (1) 'में संग्रहीत करना। – Wukerplank

उत्तर

15

आप उस के लिए 'env' का उपयोग कर सकते हैं। तो अपने मिडलवेयर में आप यह करते हैं:

def call(env) 
    env['account'] = Account.find(1) 
    @app.call(env) 
end 

आपको अपने एप्लिकेशन में 'अनुरोध' का उपयोग करके मूल्य प्राप्त कर सकते हैं:

request.env['account'] 

और वैश्विक चर का उपयोग नहीं करें या वर्ग कुछ लोगों के रूप में जिम्मेदार बताते हैं यहां सुझाव दें। खुद को परेशानियों में लाने का एक निश्चित तरीका है और वास्तव में एक बुरी आदत है।

+0

एक अच्छे उत्तर के लिए धन्यवाद। आपके उत्तर के बाद मैंने तुरंत omniauth याद किया और यह एक ही अभ्यास का उपयोग करें।मैंने यह भी देखा कि आप मार्ग की बाधा से वही काम कर सकते हैं (यह मेरे मामले में डेटाबेस में अनुरोधों की कम संख्या के लिए विशेष रूप से सहायक है) ... आप request.env पर कोई भी मूल्य पारित कर सकते हैं और इसे कार्रवाई के अंदर पकड़ सकते हैं या नियंत्रक। –

1

मैं इस एक Middelware साथ किया जा सकता है, तो पता नहीं है। मेरे सुझाव इस होगा:

class ApplicationController < ActionController::Base 

    protect_from_forgery 

    before_filter :set_my_var 

private 
    def set_my_var 
    @account ||= Account.find(1) 
    end 

end 

इस तरह से अपने सभी नियंत्रकों और विचारों आप एक cattr_accessor हो सकता है @account

+0

इस दृष्टिकोण के साथ एक समस्या यह है कि जब आप मध्यस्थ में कुछ असाइनमेंट के लिए गणना कर रहे हैं। – Ashish

-4

की पहुंच है: किसी भी मॉडल में my_var और

 
    MyModel.my_var = 'something' 
द्वारा मिडलवेयर से इस चर सेट

और आप एप्लिकेशन में कहीं भी इसका उपयोग कर सकते हैं।

+0

मुझे अच्छी तरह से समझ में नहीं आया। क्या आप असली उदाहरण बना सकते हैं? – user502052

+0

मॉडल फ़ाइल में कहीं "cattr_accessor: my_var" जोड़ें। यह MyModel.my_var के लिए एक सेटर और गेटटर बनाता है: http://pastie.org/2345283 –

+1

थ्रेड सुरक्षित नहीं है, और यहां तक ​​कि मुख्य प्रश्न पर उत्तर भी नहीं, मिडलवेयर से परिवर्तक को नियंत्रक कार्यों में कैसे पास किया जाए। –

-5

क्या आपने रूबी ग्लोबल वैरिएबल बनाने की कोशिश की है?

def call(env) 
    $account ||= Account.find(1) 

    @app.call(env) 
end 

और

<%= debug $account %> 
+1

100 मामलों में से 100 में, वैश्विक चर जवाब नहीं हैं। –

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