मेरे पास lib
में एपीआई के साथ रेल ऐप पर रूबी है। lib
में फ़ाइलें स्वत: लोड की गई हैं, और एपीआई को प्रारंभकर्ता में कॉन्फ़िगर किया गया है।रेल पर रूबी: विकास में प्रारंभकर्ता में एपीआई कॉन्फ़िगर करें
# lib/my_api.rb
module MyApi
extend Configuration
end
# lib/my_api/configuration.rb
module MyApi
module Configuration
attr_accessor :my_setting
def configure
yield self
end
end
end
# config/initializers/my_api.rb
MyApi.configure do |config|
config.my_setting = 'foo'
end
यह उत्पादन में काम करता है, लेकिन विकास में जब सर्वर शुरू होता है तो API कॉन्फ़िगर हो जाता है। मैं कुछ कोड बदलने के बाद, विन्यास खो दिया है और वहाँ त्रुटियों क्योंकि सेटिंग्स हैं nil
:
irb(main):001:0> MyApi.my_setting
=> "foo"
irb(main):002:0> reload!
Reloading...
=> true
irb(main):003:0> MyApi.my_setting
=> nil
मेरा अनुमान है कि विकास में, क्लास पुनः लोड कर रहे हैं, लेकिन प्रारंभकर्ता नहीं है, जिसका अर्थ है कि यह केवल हो जाता है सर्वर शुरू करने के बाद एक बार कॉन्फ़िगर किया गया।
अभी मैं lib/my_api.rb
में अपनी कॉन्फ़िगरेशन को डुप्लिकेट कर रहा हूं, लेकिन यह बहुत हैकी है।
इस समस्या के लिए एक साफ समाधान क्या है?
दस्तावेज़ों के मुताबिक, 'mattr_accessor'' वर्ग गुणों के लिए कक्षा और उदाहरण दोनों एक्सेसर्स को परिभाषित करता है। " यह ऑटोलोडिंग से संबंधित कुछ भी नहीं बदलता है, दुर्भाग्य से इसका मतलब है कि यह मेरी समस्या का समाधान नहीं करता है। – amiuhle
कक्षा में विशेषता को परिभाषित करके आपको केवल इनटाइलाइज़र को चलाने की आवश्यकता होती है, जब रेल कक्षा को फिर से लोड करता है तो यह अभी भी परिवर्तनीय होगा। – max
मैंने कोशिश की है, इससे कोई फर्क नहीं पड़ता है। मुझे लगता है कि कक्षा को पुनः लोड किया गया है, जिसका अर्थ है कि यह स्मृति में एक अलग वर्ग उदाहरण है। कॉन्फ़िगरेशन पुराने वर्ग के उदाहरण पर है, न कि नया। रेल कंसोल में, 'MyApi.my_setting' को कॉल करने के बाद' पुनः लोड 'के बाद सही ढंग से' foo' लौटाता है! '' MyApi.my_setting' रिटर्न 'nil' – amiuhle