2011-05-30 11 views
7

मेरे पास एक ऐसे प्रोजेक्ट में रेक के साथ चलने वाले कई पार्सर्स हैं जिन पर मैं काम कर रहा हूं। एक विधि नाम का उपयोग करते समय जो पहले से ही किसी अन्य रेक में मौजूद है, और क्योंकि वे दोनों एक ही वातावरण का उपयोग करते हैं, मुझे एक संघर्ष मिलता है।रेल परियोजना में रेक की गुंजाइश?

क्या उनके नामस्थान में रेक फ़ाइलों के दायरे को सीमित करने का कोई तरीका है? मैंने सोचा कि नामस्थान का पूरा बिंदु था?

उदाहरण:

namespace :test do 
    task :test_task => :environment do 
     ... 
    end 

    def test_method(argument) 
    ... 
    end  
end 

namespace :other_test do 
    task :test_task => :environment do 
    ... 
    end 

    def test_method(argument, argument2) 
    ... 
    end 
end 

इस मामले में, जब rake test:test_task चल मैं तर्क त्रुटि के एक अमान्य राशि प्राप्त होगी। दूसरी तरफ, यदि मैं कार्य के भीतर विधि को परिभाषित करता हूं, तो मुझे विधि को रेक फ़ाइल के शीर्ष पर रखना होगा। यह भ्रमित और बदसूरत हो जाता है।

क्या यह सिर्फ एक आवश्यक बुराई है?

धन्यवाद!

उत्तर

8

मैं फ़ाइल सिस्टम में निर्देशिकाओं के समान उद्देश्य की सेवा के रूप में रेक कार्यों के लिए नामस्थान देखता हूं: वे encapsulation के बजाय संगठन के बारे में हैं। यही कारण है कि डेटाबेस कार्यों db: में हैं,, rails: में कार्य रेल आदि

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

सबसे अच्छा समाधान अपने रेक कार्यों को बहुत पतला (कंट्रोलर की तरह) बनाने और किसी भी सहायक तरीके (जैसे test_method) को कुछ लाइब्रेरी फ़ाइल में कहीं समझदार बनाने के लिए है। एक रेक कार्य आमतौर पर बस थोड़ा सा सेट अप करना चाहिए और फिर वास्तविक कार्य करने के लिए लाइब्रेरी विधि को कॉल करना चाहिए (यानी नियंत्रक के समान सामान्य लेआउट)।

कार्यकारी सारांश: अपने पुस्तकालय फ़ाइलों में कहीं भी वास्तविक काम और भारी भारोत्तोलन डालें और अपने पुस्तकालयों के लिए अपने रेक कार्यों को पतली रैपर बनाएं। इससे आपकी समस्या उचित कोड संगठन के माध्यम से दूर होनी चाहिए।

+0

अनुवर्ती प्रश्न: http: // stackoverflow।कॉम/प्रश्न/6183367/डायनामिक-नेमस्पेस-रेक-एंड-पार्सर-क्लासेस-साथ-रेल –

+0

क्या आपको कोई नज़र रखने का मौका मिला है? –

0
module Anonymous 
    namespace :test do 
    # brabra 
    end 
end 
self.class.send(:remove_const, :Anonymous) 

module Anonymous 
    namespace :another_test do 
    # brabra 
    end 
end 
self.class.send(:remove_const, :Anonymous) 

Module.new do end ब्लॉक किसी भी परिभाषा से पहले आप self:: की जरूरत है। इससे बचने के लिए, आपको मॉड्यूल का नाम देने और इसे हटाने की आवश्यकता है।

0

मैंने रेक कार्यों में विधियों को नाम देने का एक तरीका निकाला है, इसलिए नामित विधियां टकरा नहीं जाती हैं।

  1. एक विशिष्ट नामित मॉड्यूल में प्रत्येक बाहरी नामस्थान को लपेटें।
  2. extend Rake::DSL
  3. कक्षा विधियों में अपनी विधियां बदलें (self. के साथ)।

मैंने इसका परीक्षण किया है, और यह अभी भी एक रेक मॉड्यूल को किसी दूसरे मॉड्यूल में आने वाले किसी अन्य रेक कार्य पर आक्रमण या निर्भर करने की अनुमति देता है।

उदाहरण:

module Test 
    extend Rake::DSL 

    namespace :test do 
    task :test_task => :environment do 
     ... 
    end 

    def self.test_method(argument) 
     ... 
    end  
    end 
end 

module OtherTest 
    extend Rake::DSL 

    namespace :other_test do 
    task :test_task => :environment do 
     ... 
    end 

    def self.test_method(argument, argument2) 
     ... 
    end 
    end 
end 
संबंधित मुद्दे