2011-06-08 13 views
8

से Rails autoload_path में जोड़ना मैं एक मणि लिखना चाहता हूं जो एक रेल अनुप्रयोग में app/services निर्देशिका जोड़ता है।जेम

मैं रत्न के भीतर से जोड़ना चाहते हैं के बाद से मैं इस समाधान के साथ आया था:

class Railtie < ::Rails::Railtie 
    config.after_initialize do |app| 
    ::Rails.logger.info "adding #{ActiveService::Configuration.path} to autoload_path" 
    app.config.autoload_paths = [ActiveService::Configuration.path] + app.config.autoload_paths 
    end 
end 

समस्या यह है कि config.autoload_path, एक जमे हुए सरणी है इतना है कि यह modifing एक अच्छा विचार हो के लिए नहीं लगता है।

किसी भी सुझाव को बेहतर तरीके से कैसे प्राप्त किया जा सकता है?

उत्तर

11

config.autoload_paths:set_autload_paths initializer के अंदर जमे हुए है। ऐरे ActiveSupport::Dependencies.autoload_paths पर पारित किया गया है, इसलिए मूल ऐरे को संशोधित करने से ज्यादा समझ नहीं आएगी। इसलिए यह जमे हुए है।

आप इससे पहले कि यह पारित कर दिया है और जमे हुए :before => :set_autoload_paths में हुक और config.autoload_paths विस्तार करने के लिए सक्षम होना चाहिए: एप्लिकेशन/* तहत

class Railtie < ::Rails::Railtie 
    initializer 'activeservice.autoload', :before => :set_autoload_paths do |app| 
    app.config.autoload_paths << ActiveService::Configuration.path 
    end 
end 

प्रारंभकर्ता हुक के बारे में प्रलेखन पर guides.rubyonrails.org/initialization.html

+0

इस दृष्टिकोण होनहार लग रहा है, लेकिन दुर्भाग्य से यह काम नहीं करता! ऐसा लगता है कि '' 'app.config'' 'इंजन वर्ग के भीतर उपयोग की जाने वाली कॉन्फ़िगरेशन से अलग है। मैं वर्तमान में रेली '' 'pre_configuration'' हुक का उपयोग करने के साथ अटक गया हूं, जो autoload_paths सरणी सेट कर सकता है, लेकिन सभी अन्य प्रारंभकर्ताओं के सामने चलता है। इसलिए मुझे किसी भी कॉन्फ़िगरेशन को एक yml फ़ाइल में रखना होगा। – phoet

+0

पता नहीं था कि इंजन शामिल थे। क्या इसका परीक्षण करने के लिए एक अद्यतित भंडार है? – rubiii

+0

सुनिश्चित करें: https://github.com/phoet/active_service – phoet

4

पहले पाया जा सकता है, सभी निर्देशिकाओं पहले से ही रेल 3.0 के बाद से लोड पथ में। किसी भी मामले में, यदि आप इसे करना चाहते हैं, तो आपको इसके बजाय पथ एपीआई का उपयोग करना चाहिए। रेल स्रोत कोड से उदाहरण:

https://github.com/rails/rails/blob/master/railties/lib/rails/engine/configuration.rb#L42

+0

का मतलब है कि आप '' 'app.config.paths.add" lib/services "जैसे हैं: eager_load => true'' इसे सीधे autoload_paths में जोड़ने के बजाय? मेरी समस्या यह है कि यह केवल '' 'pre_configuration'' हुक में काम करता है। इसे हर दूसरे प्रारंभकर्ता में पथ में जोड़ना परिवर्तनों को अनदेखा करता है और कक्षाएं लोड नहीं होती हैं। – phoet

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