2012-01-18 6 views
5

मैं अपने config.ru में रैक प्रारंभिक कोड के भीतर से अपने वेब ऐप का मूल URL पुनर्प्राप्त करने में सक्षम होना चाहता हूं। की तर्ज पर कुछ:क्या मुझे एक अनुरोध हैंडलर के बाहर मेरी रैक सेवा का मूल URL मिल सकता है?

puts "Starting up on http://#{ENV['SERVER_NAME']}:#{ENV['SERVER_PORT']}/#{ENV['MOUNT_POINT']}..." 

लेकिन मुझे लगता है कि एक अनुरोध हैंडलर के बाहर से उपलब्ध है इस तरह कुछ भी नहीं मिला है। जाहिर है, मैं कुछ ऐसा कर सकता हूं:

... 
def get 
    puts "Got a request for #{ENV['rack.url_scheme']}://#{ENV['HTTP_HOST']}#{ENV['REQUEST_PATH']}" 
    ... 

क्योंकि अनुरोध उस बिंदु पर परिभाषित किया गया है। लेकिन मेरी कॉन्फ़िगरेशन फ़ाइल की शुरुआत में, इनमें से कोई भी चर परिभाषित नहीं किया गया है।

क्या कोई रैक विधि है जिसका उपयोग मैं इस जानकारी तक पहुंचने के लिए कर सकता हूं? क्या यह उन मामलों में से एक है जहां रैक स्टार्टअप समाप्त होने तक उन चीजों को अंतिम रूप दिया नहीं जाता है? मुझे लगता है कि अन्य ढांचे को एक विधि को एक प्रक्रिया को पास करने का तरीका है जो पर्यावरण को "तैयार" होने के बाद निष्पादित करेगा। क्या रैक के पास ऐसा कुछ है?

+0

आप config.ru में सेट करने का प्रयास कर रहे हैं, जिसे इस जानकारी की आवश्यकता है? – nictrix

+0

मैं * सेट * सेट करने की कोशिश नहीं कर रहा हूं, मुझे लगता है कि यह दिखाने के लिए लॉग के लिए अच्छा है कि सेवा कहां है - यह विशेष रूप से तब उपयोगी होता है जब कोई नया देव पहली बार परीक्षण करने की कोशिश करता है। – Coderer

उत्तर

2

मुझे विश्वास नहीं है कि एक रैक एप्लिकेशन के लिए यह संभव है कि "माउंट पॉइंट" के समय से पहले पता चल सके। उदाहरण के लिए, इस config.ru mounts कई पर एक ही एप्लिकेशन माउंट पॉइंट:

require 'rack' 

app = proc { |env| 
    [200, {'Content-Type' => 'text/plain'}, ['hello, world!']] 
} 

run Rack::URLMap.new('/myapp' => app, 
        '/' => app) 

रैक भी किसी भी मानक विधि है कि प्रारंभ समय में कहा जाता है प्रदान नहीं करता है। मुझे संदेह है क्योंकि यह रैक सादा सीजीआई का समर्थन करने की कोशिश करता है, जहां प्रत्येक अनुरोध को पूरा करने के लिए प्रत्येक अनुरोध को संभालने के लिए पूरी रूबी प्रक्रिया बनाई जा सकती है। उस स्थिति में, "init" विधि के लिए बहुत अधिक उपयोग नहीं है।

2

यह लगभग एक साल बाद है, लेकिन मैं सिर्फ एक ही समस्या के साथ संघर्ष कर रहा था और अपना धागा पाया।

प्रत्येक रैक एप्लिकेशन एक कॉल-विधि प्रदान करता है जिसे रैक हैंडलर द्वारा बुलाया जाता है। उदाहरण के लिए सिनात्रा :: बेस # कॉल का कोड देखें। यह कॉल विधि प्रति अनुरोध एक बार बुलाया जाता है और इसमें एक पैरामीटर है जो हैश है जिसमें पर्यावरण चर शामिल हैं। इनके भीतर आपको जो भी चाहिए वह सब कुछ है और "माउंट_पॉइंट" जिसे आप पूछ रहे थे उसे "SCRIPT_NAME" कहा जाता है।

विवरण के लिए http://www.rubydoc.info/github/rack/rack/file/SPEC देखें। दुर्भाग्यवश यह जानकारी केवल अनुरोध के दौरान आपके लिए उपलब्ध है और जहां तक ​​मुझे पता है। उम्मीद है कि यह दूसरों की मदद करता है।

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