2015-07-20 4 views
6

मेरे पास 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 में अपनी कॉन्फ़िगरेशन को डुप्लिकेट कर रहा हूं, लेकिन यह बहुत हैकी है।

इस समस्या के लिए एक साफ समाधान क्या है?

उत्तर

0

ठीक है, जब तक कोई बेहतर समाधान के साथ आता है, मैं दो कामकाज के साथ आया हूं। मैं 2.

  1. lib निर्देशिका (जिसका मतलब एपीआई ऑटोलोड नहीं है) को स्वत: लोड न करें। इसका मतलब है कि जब एपीआई कोड बदलता है तो सर्वर को पुनरारंभ करना होता है, लेकिन समस्या हल करता है। यही कारण है कि इस तरह के रत्नों को कॉन्फ़िगर करना - क्योंकि वे स्वत: लोड नहीं होते हैं।
  2. मैन्युअल lib/my_api.rb के अंत में विकास में प्रारंभकर्ता को फिर से लोड:

    load Rails.root.join('config/initializers/smart_meter.rb') if Rails.env.development?

MyApi निरंतर एक नया जब रेल autoloads वर्गों द्वारा प्रतिस्थापित किया जाएगा। कॉन्फ़िगरेशन अभी भी पुराने ऑब्जेक्ट पर उपलब्ध है:

Loading development environment (Rails 4.2.0) 
irb: warn: can't alias context from irb_context. 
irb(main):001:0> MyApi.my_setting 
=> "foo" 
irb(main):002:0> OldMyApi = MyApi 
=> MyApi 
irb(main):003:0> reload! 
Reloading... 
=> true 
irb(main):004:0> MyApi.my_setting 
=> nil 
irb(main):005:0> OldMyApi.my_setting 
=> "foo" 
irb(main):006:0> load Rails.root.join('config/initializers/smart_meter.rb') 
=> true 
irb(main):007:0> MyApi.my_setting 
=> "foo" 
0
module MyApi 
    module Configuration 
    mattr_accessor :my_setting 
    def configure 
     yield self 
    end 
    end 
end 

mattr_accessor मॉड्यूल स्तर एक्सेसर्स बनाने के लिए एक सक्रिय समर्थन मैक्रो है।

+1

दस्तावेज़ों के मुताबिक, 'mattr_accessor'' वर्ग गुणों के लिए कक्षा और उदाहरण दोनों एक्सेसर्स को परिभाषित करता है। " यह ऑटोलोडिंग से संबंधित कुछ भी नहीं बदलता है, दुर्भाग्य से इसका मतलब है कि यह मेरी समस्या का समाधान नहीं करता है। – amiuhle

+0

कक्षा में विशेषता को परिभाषित करके आपको केवल इनटाइलाइज़र को चलाने की आवश्यकता होती है, जब रेल कक्षा को फिर से लोड करता है तो यह अभी भी परिवर्तनीय होगा। – max

+0

मैंने कोशिश की है, इससे कोई फर्क नहीं पड़ता है। मुझे लगता है कि कक्षा को पुनः लोड किया गया है, जिसका अर्थ है कि यह स्मृति में एक अलग वर्ग उदाहरण है। कॉन्फ़िगरेशन पुराने वर्ग के उदाहरण पर है, न कि नया। रेल कंसोल में, 'MyApi.my_setting' को कॉल करने के बाद' पुनः लोड 'के बाद सही ढंग से' foo' लौटाता है! '' MyApi.my_setting' रिटर्न 'nil' – amiuhle

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