2011-06-09 14 views
6

मेरे पास कई अलग-अलग कार्य हैं _। कस्टम क्लास विधियों का उपयोग मैं अपने ऐप में करना चाहता हूं। मैं ऐप/मॉड्यूल निर्देशिका में उन तरीकों के लिए कोड में कोड होना चाहता हूं।मैं ऐप/मॉड्यूल से ActiveRecord कैसे बढ़ा सकता हूं?

मैं यह काम करने में असमर्थ रहा हूं।

उदाहरण के लिए, मैं एक फ़ाइल है: एप्लिकेशन/मॉड्यूल/acts_as_lockable

module ActsAsLockable 

    def acts_as_lockable 
     before_create :set_lock 

     include InstanceMethods 
    end 

    module InstanceMethods 
     protected 

     def set_lock 
      now = Time.now.to_s 
      self.lock = Digest::SHA1.hexdigest(now) 
     end 
    end 

end 

ActiveRecord::Base.extend ActsAsLockable 

और में application.rb

config.autoload_paths += %W(#{config.root}/app/modules) 

जब मैं एक मॉडल है कि acts_as_lockable मैं कहता अप लोड करने का प्रयास निम्नलिखित त्रुटि:

NameError: undefined local variable or method `acts_as_lockable'

मेरा अनुमान है कि मुझे मॉड्यूल फ़ोल्डर को स्वत: लोड नहीं करना चाहिए जब मैं इसे विस्तारित करता हूं तो ause ActiveRecord पहले ही लोड हो चुका है? क्या इसे करने का और कोई तरीका है? मैं अपने सर्वर को पुनरारंभ किए बिना फ़ाइल के दौरान फ़ाइल को बदलने में सक्षम होना चाहता हूं लेकिन यह एक आवश्यकता है जो एक आवश्यकता है।

उत्तर

7

मुझे लगता है कि आप गलत तरीके से इस बारे में सोच रहे हैं।

आप लोड पथ के लिए इस मॉड्यूल जोड़ रहे हैं,

लेकिन यह केवल लोड होगा अगर आप कहते हैं कि या तो;

require 'acts_as_lockable' 

या

ActsAsLockable 

मैं तुम्हें सुझाव देंगे वास्तव में कभी नहीं अपने कोड के अंदर इन दोनों में से कहना चाहता हूँ।

आप जो सही प्रतिमान खोज रहे हैं वह एक "प्रारंभकर्ता" है।

मैं तुम्हें "config/initializers/acts_as_lockable.rb"

नामक एक फ़ाइल इस फ़ाइल को आप या तो पूरा कोड शामिल कर सकते हैं में बनाने की सलाह,

या सिर्फ एक require 'acts_as_lockable'

आम तौर पर मैं शामिल libs निर्देशिका के अंदर इस तरह बातें रखने

सुनिश्चित lib लोड पथ में है

** विन्यास/आवेदन।rb **

config.autoload_paths += %W(#{config.root}/lib) 

** lib/acts_as_lockable.rb **

module ActsAsLockable 

    def acts_as_lockable 
    before_create :set_lock 

    include InstanceMethods 
    end 

    module InstanceMethods 
    protected 

    def set_lock 
     now = Time.now.to_s 
     self.lock = Digest::SHA1.hexdigest(now) 
    end 
    end 

end 
तो प्रारंभकर्ता में

** config/initializers/acts_as_lockable.rb **

require 'acts_as_lockable' 
ActiveRecord::Base.extend ActsAsLockable 
+0

धन्यवाद कि एक आकर्षण की तरह काम किया। मुझे एहसास है कि यह शायद सबसे व्यावहारिक समाधान नहीं है, लेकिन किसी कारण से मुझे अपने मॉडल में बयान शामिल करने से नफरत है। – tanman

0

समस्या यह है कि रूबी ऑटोलोड सिस्टम एक आलसी प्रक्रिया है: जब आपके कोड के भीतर एक्ट्सएस्लॉकबल जैसे निरंतर उपयोग किया जाता है, तो यह autoload_paths के भीतर act_as_lockable.rb नामक फ़ाइल की तलाश करता है। जैसा कि आप वास्तव में कभी भी ActAsLockable का उपयोग नहीं करते हैं, फ़ाइल कभी लोड नहीं होती है। तुम कर सकते हो (हालांकि काफी सुंदर नहीं):

ActsAsLockable 

class MyModel < ActiveRecord::Base 
    acts_as_lockable 

    ... 
end 

मुझे लगता है कि acts_as_ * पैटर्न प्लगइन्स और जवाहरात हो प्रयोग की जाने वाली आसानी से अपने कोड में कार्यक्षमता को एकीकृत करने जाहिर है। जब आप उन्हें अपने प्रोजेक्ट में एकीकृत करते हैं तो प्लगइन्स और रत्न अंतिम स्थिति में होने चाहिए, इसलिए आपको विकास मोड के लिए पुनः लोड करने की कार्यक्षमता की आवश्यकता नहीं होगी।

मुझे उम्मीद है कि इससे मदद मिलती है।

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