2011-03-06 17 views
5

मैं ऐसा करने का प्रयास करता हूं:रेल: मॉड्यूल से कॉलबैक

ऐप/मॉडल/my_model.rb:

class MyModel < ActiveRecord::Base 
    include MyModule 
    ... 
end 

lib/my_module.rb:

module MyModule 
    before_destroy :my_func #! 

    def my_func 
    ... 
    end 
end 

लेकिन मुझे एक त्रुटि मिलती है:

undefined method `before_destroy' for MyModule:Module 

मैं इसे कैसे ठीक कर सकता हूं।

इसके अलावा मैं रूबी के लिए नया हूँ। इन "विशेषताओं" में किस प्रकार का है: first_destroy, मान्य, has_many? क्या वे चर या विधियां हैं या क्या? धन्यवाद

उत्तर

14

before_destroy, validates, आदि विशेषताएँ या कुछ भी नहीं हैं। ये विधि कॉल हैं।

रूबी में, कक्षा का शरीर सभी निष्पादन योग्य कोड है, जिसका अर्थ है कि कक्षा निकाय की प्रत्येक पंक्ति को एक विधि निकाय की तरह इंटरपेटर द्वारा निष्पादित किया जाता है।

before_destroy :my_func एक सामान्य रूबी विधि कॉल है। जिस विधि को बुलाया जाता है वह before_destroy है, और इसे एक तर्क के रूप में :my_func प्रतीक प्राप्त होता है। इस विधि को कक्षा (या मॉड्यूल) में उस दायरे में देखा जाता है जिसे इसे कहा जाता है।

तो अपने प्रश्न पर जाने से, मुझे लगता है कि अब आप को समझना चाहिए कि यह इस मॉड्यूल में विधि before_destroy के लिए अपने शरीर और खोजों को क्रियान्वित करने शुरू होता है जब दुभाषिया अपने मॉड्यूल

module MyModule 
    before_destroy :my_func #! 

    def my_func 
    ... 
    end 
end 

लोड करता है और एक नहीं मिल रहा। आप क्या करना चाहते हैं इस विधि को मॉड्यूल पर नहीं, बल्कि उस वर्ग पर जहां मॉड्यूल शामिल है। इसके लिए हमारे पास Module#included विधि का उपयोग कर एक सामान्य मुहावरे है:

module MyModule 
    module InstanceMethods 
    def my_func 
     ... 
    end 
    end 

    def self.included(base) 
    base.send :include, InstanceMethods 
    base.before_destroy :my_func 
    end 
end 
0

lib/my_module.rb में, ऐसा करते हैं:

 
    class MyInheritedClass < ActiveRecord::Base 
    before_destroy :my_func 
    def my_func 
     ... 
    end 
    end 

एप्लिकेशन/मॉडल/my_model.rb में, इस कार्य करें:

 
class MyModel < MyInheritedClass 
    ... 
end 

मॉड्यूल में कोई before_destroy फिल्टर नहीं है आप ऊपर बनाने की कोशिश कर रहे हैं। मेरा कोड क्या करता है वह वर्ग बना रहा है जो ActiveRecord :: बेस से प्राप्त होगा और यह आपकी टेम्पलेट क्लास होगी जो आपके सभी अन्य वर्गों से प्राप्त हो सकती है। टेम्पलेट क्लास में ActiveRecord :: Base के सभी गुण भी शामिल हैं।

0

यू MyModule से before_destroy निकाल कर इस सही कर सकते हैं और MyModel में रखें बजाय

before_destroy और अन्य कॉलबैक केवल वर्ग है जो ActiveRecord :: बेस फैली के लिए उपलब्ध हैं, अधिक जानकारी here

आशा है कि यह मदद करता है =)

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