पटरियों 4 में स्वतः लोड हो रही है


229

मैं /libविकास के दौरान अपनी निर्देशिका में ऑटोलॉड कोड के लिए इनिशियलाइज़र में निम्न लाइन का उपयोग करता हूं :

config / initializers / custom.rb:

RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?

( रेल 3 Quicktip से: विकास मोड में ऑटो पुनः लोड करने योग्य फ़ोल्डर )

यह बहुत अच्छा काम करता है, लेकिन यह उत्पादन में उपयोग करने के लिए बहुत ही अक्षम है- प्रत्येक अनुरोध पर काम के बोझ को लोड करने के बजाय, मैं उन्हें स्टार्ट अप पर लोड करना चाहता हूं। उसी ब्लॉग में ऐसा करने का वर्णन करने वाला एक और लेख है :

config / application.rb:

# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

हालांकि, जब मैं उस पर स्विच करता हूं, तो विकास में भी, मुझे काम के कार्यों का उपयोग करने की कोशिश करते समय NoMethodErrors मिलता है।

मेरी एक लीब फाइल का उदाहरण:

lib / extensions.rb:

Time.class_eval do
  def self.milli_stamp
    Time.now.strftime('%Y%m%d%H%M%S%L').to_i
  end
end

कॉलिंग Time.milli_stampNoMethodError फेंक देगा

मुझे लगता है कि अन्य लोगों ने एसओ पर इसी तरह के सवालों के जवाब दिए हैं, लेकिन वे सभी नामकरण सम्मेलनों और अन्य मुद्दों से निपटते हैं, जिनके बारे में मुझे पहले चिंता करने की ज़रूरत नहीं थी- मेरे परिश्रमी वर्ग पहले से ही प्रति-अनुरोध लोड करने के लिए काम करते थे, मैं इसे बदलना चाहता हूं प्रति करने के लिए- स्टार्टअप लोड हो रहा है। ऐसा करने का सही तरीका क्या है?


जब एक रेल एप्लिकेशन शुरू होता है, तो कॉन्फ़िगर / इनिशलाइज़र फ़ोल्डर स्वचालित रूप से लोड होता है?
Jwan622

जवाबों:


548

मुझे लगता है कि इससे आपकी समस्या हल हो सकती है:

  1. in config / application.rb :

    config.autoload_paths << Rails.root.join('lib')

    और सही नामकरण सम्मेलन को दलबदल में रखें

    in lib / foo.rb :

    class Foo
    end

    in lib / foo / bar.rb :

    class Foo::Bar
    end
  2. यदि आप वास्तव में lib / एक्सटेंशन.rb जैसी फ़ाइल में कुछ बंदर पैच करना चाहते हैं , तो आपको मैन्युअल रूप से इसकी आवश्यकता हो सकती है:

    in config / initializers / requirement.rb :

    require "#{Rails.root}/lib/extensions" 

पुनश्च


1
@ ifyouseewendy- आप बिल्कुल सही कह रहे हैं- क्योंकि Extension.rb रेल नामकरण परंपराओं का पालन नहीं कर रहा था, रेल इसे लोडिंग प्रक्रिया में शामिल नहीं करेंगे। मैं इसे मैन्युअल रूप से इसकी आवश्यकता के द्वारा काम कर रहा हूं।
यारिन

@ifyouseewendy मॉडल लोड होने से पहले मैं फ़ाइलों को कैसे शामिल कर सकता हूं? ऑटोलैड के लिए पथ जोड़ें यह शांत है, लेकिन समावेश के आदेश को कैसे नियंत्रित करें? thx
मैट्रिक्स

@ मैटरिक्स में "मॉडल लोड होने से पहले की फाइलें शामिल हैं", आपको ऑटोलैड सुविधा का उपयोग किए बिना मैन्युअल रूप से आपकी फ़ाइल की आवश्यकता हो सकती है।
ifyouseewendy

@ifyouseewendy अगर मुझे इनिशियलाइज़र में इसकी आवश्यकता है लेकिन फाइल ऑटोलैड_पैथ में है, तो इसे पुनः लोड किया जाएगा (2 बार लोड किया गया) या नहीं? .ire php की तरह एक "requirement_once" है?
मैट्रिक्स

5
यह उत्पादन में रेल 5 एपीआई में काम नहीं करता है (लेकिन विकास में है)। मेरा मानना ​​है कि आपको उपयोग करने की आवश्यकता है config.eager_load_paths << Rails.root.join('lib')। हालाँकि, इसमें एक बड़ा नकारात्मक पहलू यह भी है कि eager_load_pathsकार्यों में सब कुछ लोड हो जाता है। मुझे लगता है कि लूलालाल का हल बेहतर है। यहाँ अधिक विवरण के साथ एक ब्लॉग पोस्ट है: blog.arkency.com/2014/11/…
hirowatari

33

हालांकि यह सीधे सवाल का जवाब नहीं देता है, लेकिन मुझे लगता है कि यह सवाल से बचने के लिए एक अच्छा विकल्प है।

सभी autoload_pathsया eager_load_pathsपरेशानी से बचने के लिए , "एप्लिकेशन" निर्देशिका के तहत एक "लीब" या "मिस" निर्देशिका बनाएं। कोड रखें जैसा कि आप सामान्य रूप से वहां करते हैं, और रेलें फाइलों को वैसे ही लोड करेंगी जैसे यह कैसे (और पुनः लोड) मॉडल फ़ाइलों को लोड करेगी।


3
मैं रेल्स 4.2 में हूं। और यह ऑटो लोड फ़ाइलों के तहत नहीं करता है app, मुझे इसे मैन्युअल रूप से करने की आवश्यकता है ...... या इसे ऑटो लोड पथ में डालने की आवश्यकता है ..
अरूप रक्षित

6
आप गलत हैं, अरूप, ऐप डायरेक्टरी की कोई भी उपनिर्देशिका स्वतः ही ऑटोलैड_पाथ्स एरे
डॉ। सारंगेलोव

app/viewsनिर्देशिका को छोड़कर जो जोड़ा नहीं जाता है; या बल्कि स्पष्ट रूप से हटा दिया जाता है।
जेम्स बी। बर्न

1
बहुत बढ़िया जवाब। केवल वह चीज जो मेरे लिए 5 / api रेल पर काम करती थी।
jstafford

6
बस याद है कि libकोड के लिए है कि कई परियोजनाओं के लिए लागू किया जा सकता है और संभवतः एक मणि के लिए निकाला जा सकता है। यदि इन के रूप में services/या presenters/यहां तक ​​कि उप-विभाजनों के तहत ऐप खोज के तहत एक अधिक उपयुक्त फ़ोल्डर नहीं बनाते हैं ।
फिल्प

6

यह मेरे जैसे किसी व्यक्ति की मदद कर सकता है जो इस उत्तर को ढूंढता है जब समाधान की खोज करता है कि कैसे रेल लोडिंग को संभालता है ... मैंने पाया कि मुझे एक परिभाषित करना था module किसका नाम मेरे फ़ाइल नाम से उचित रूप से मेल खाता है, बजाय केवल एक वर्ग को परिभाषित करने के:

फ़ाइल में lib / development_mail_interceptor.rb (हाँ, मैं एक Railscast से कोड का उपयोग कर रहा हूँ :))

module DevelopmentMailInterceptor
  class DevelopmentMailInterceptor
    def self.delivering_email(message)
      message.subject = "intercepted for: #{message.to} #{message.subject}"
      message.to = "myemail@mydomain.org"
    end
  end
end

काम करता है, लेकिन यह लोड नहीं करता है अगर मैंने क्लास को मॉड्यूल के अंदर नहीं रखा है।


1
रूबी में "उपयुक्त रूप से मिलान" का अर्थ है कि फ़ाइल फ़ाइल सिस्टम में LOAD_PATH/module/class.rb(अंडरस्कोर) स्थित है जहां LOAD_PATHरूबी ऐप (रेल के मामले में ऑटोलॉड_पैथ्स) द्वारा उपयोग किए जाने वाले लोड पथ में है। libऑटो से लोड नहीं होने के कारण ऑटो से उतारा नहीं जा रहा है, और हाल के संस्करणों (> = रेल 3.x) में उतार-चढ़ाव हुआ है, यह ऑटोलेड नहीं है। जो भी जादू आपके लिए यह काम कर रहा है वह अनुशंसित नहीं है। शायद यह एक पुरानी Railscast है?
पीटर एच। बोलिंग

0

विकास मोड में हर अनुरोध के लिए आपको बंदर पैच / एक्सटेंशन लोड करने के लिए config.to_prepare का उपयोग करें।

config.to_prepare do |action_dispatcher|
 # More importantly, will run upon every request in development, but only once (during boot-up) in production and test.
 Rails.logger.info "\n--- Loading extensions for #{self.class} "
 Dir.glob("#{Rails.root}/lib/extensions/**/*.rb").sort.each do |entry|
   Rails.logger.info "Loading extension(s): #{entry}"
   require_dependency "#{entry}"
 end
 Rails.logger.info "--- Loaded extensions for #{self.class}\n"

समाप्त

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.