2010-03-22 12 views
12

मैं रूबी के लिए वहाँ बाहर महान प्लगइन्स के सभी तरह कुछ को लागू करने की है, ताकि आप यह कर सकते हैं आशा करती हूं कि:रुबी में शामिल मॉड्यूल के लिए पास पास?

acts_as_commentable 
has_attached_file :avatar 

लेकिन मैं एक बाधा है:

कि सहायक विधि कर सकते हैं केवल एक मॉड्यूल शामिल करें; यह किसी भी चर या विधियों को परिभाषित नहीं कर सकता है।

इस का कारण है, क्योंकि, मैं विकल्पों type की तरह कुछ को परिभाषित करने के हैश, और उस में से एक में परिवर्तित किया जा सकता 20 विभिन्न 'workhorse' मॉड्यूल है, जो सभी मैं एक लाइन में योग कर सकता है कहना चाहता हूँ

def dynamic_method(options = {}) 
include ("My::Helpers::#{options[:type].to_s.camelize}").constantize(options) 
end 

तब उन 'workhorses' विकल्प संभाल होता है, की तरह काम करने:

has_many "#{options[:something]}" 

यहाँ संरचना कैसा दिखता है, और मैं सोच रहा हूँ अगर तुम नहीं जानते कि इस तरह वह पहेली में भाग लापता:

# 1 - The workhorse, encapsuling all dynamic variables 
module My::Module 
    def self.included(base) 
    base.extend ClassMethods 
    base.class_eval do 
     include InstanceMethods 
    end 
    end 

    module InstanceMethods 
    self.instance_eval %Q? 
     def #{options[:my_method]} 
     "world!" 
     end 
    ? 
    end 

    module ClassMethods 
    end 
end 

# 2 - all this does is define that helper method 
module HelperModule 
    def self.included(base) 
    base.extend(ClassMethods) 
    end 

    module ClassMethods 

    def dynamic_method(options = {}) 
     # don't know how to get options through! 
     include My::Module(options) 
    end 

    end 
end 

# 3 - send it to active_record 
ActiveRecord::Base.send(:include, HelperModule) 

# 4 - what it looks like 
class TestClass < ActiveRecord::Base 
    dynamic_method :my_method => "hello" 
end 

puts TestClass.new.hello #=> "world!" 

%Q? कि मैं पूरी तरह से कैसे उपयोग करने के लिए यकीन नहीं है, लेकिन मैं मूल रूप से बस किसी भी तरह workhorse मॉड्यूल में है कि सहायक विधि से options हैश पारित करने के लिए सक्षम होने के लिए इच्छुक हूँ । क्या यह संभव है? इस तरह, वर्कहोर मॉड्यूल सभी प्रकार की कार्यक्षमता को परिभाषित कर सकता है, लेकिन मैं रनटाइम पर जो कुछ भी चाहता था वैरिएबल का नाम दे सकता था।

उत्तर

2

आप Modularity मणि को देखने के लिए चाहते हो सकता है , जो वही करता है जो आप चाहते हैं।

3

मैं कुछ चालाक रूबी कोड के आधार पर कुछ इसी तरह काम कर रहा हूं, जिसे मैंने एक बार देखा लेकिन अब फिर से नहीं मिल रहा है। मेरे पास लगभग काम कर रहा है, लेकिन यह आपके मॉड्यूल में self.included और self.extended चीजों को गड़बड़ कर देता है, कुछ हद तक स्पष्ट कारणों के लिए जो काम किया जा सकता है, लेकिन मुझे यह पसंद नहीं है कि यह कितना जटिल होगा। मुझे लगता है कि एक चाल है जिसे मैंने अभी तक नहीं सोचा है जो इस काम को और अधिक पूरी तरह से बनाएगा।

तो यह आपके लिए काम कर सकता है या नहीं भी हो सकता है, लेकिन मैं जो कोशिश कर रहा हूं वह आपके विकल्पों के आधार पर गतिशील रूप से बनाए गए अज्ञात मॉड्यूल का विचार है। (मुझे लगता है कि 'टाइप' एक आरक्षित शब्द हो सकता है लेकिन मुझे यकीन नहीं है, तो चलो इसके बजाय "विकल्प" कहें)। इस विचार को देखें:


Module HelperModule 
    def[](options) 
     Module.new do 
     include HelperModule 
     define_method(:options) { options } 
     end 
    end 

    def options 
    raise TypeError.new("You need to instantiate this module with [], man!") 
    end 
end 

obj = Object.new 
obj.extend(HelperModule) 
obj.options => raises TypeError 

obj = Object.new 
obj.extend(HelperModule[ :my_option => "my_option" ] 
obj.options => { my_option => "my_option } 

साफ-सुथरा, हुह? लेकिन अभी तक मेरे लिए काफी अच्छा नहीं है, क्योंकि हेलपर मॉड्यूल [विकल्प] से प्राप्त वास्तविक मॉड्यूल में मूल हेल्पर मॉड्यूल से self.included और self.extended नहीं है। मुझे लगता है कि मैं सिर्फ anon मॉड्यूल में self.included और self.extended परिभाषित कर सकता हूं, लेकिन मुझे कोड भ्रम पसंद नहीं है। मुझे अज्ञात मॉड्यूल में स्पष्ट रूप से "हेल्पर मॉड्यूल" शामिल करना पसंद नहीं है, बल्कि मैं "स्वयं" की तरह, "स्वयं" को छोड़कर, सही चीज़ का मतलब नहीं लेता, इसलिए यह काम नहीं करता है । , इस सामान्य दृष्टिकोण है कि यह आप के लिए काम करना चाहिए लगता है यह paramix मणि द्वारा आपूर्ति की जा सकती है:

आह, प्रतीक्षा करें, लगता है कि क्या मैं सिर्फ पता चला http://rubyworks.github.com/paramix/

0

ActionModel मणि आपकी मदद कर सकता है। मैं इसे अपनी परियोजनाओं में उपयोग करता हूं।

+0

क्या आप इस बारे में विस्तार से बता सकते हैं कि यह इस उदाहरण में कैसे मदद कर सकता है?यह आपके लिए स्पष्ट हो सकता है, लेकिन इस साइट पर अच्छे उत्तरों में इस प्रकार की जानकारी शामिल है। एक स्पष्टीकरण के बिना एक सूचक वास्तव में एक जवाब नहीं है .... – GreenAsJade

+0

यह ruby ​​वर्ग के लिए act_as DSL है। आप फ़ील्ड और विकल्पों को क्रिया (मॉड्यूल) में पास कर सकते हैं, उदाहरण के लिए act_as_searchable: शीर्षक, अनदेखा: सत्य –

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