2011-12-01 18 views
14

मैं निम्नलिखित की तरह दो रैक कार्यों ही नाम स्थान के तहत है:रेक कार्य चर

namespace :db do 
    task :first_task => :environment do 
     server_name='myserver' 
     connect_to(server_name) 
    end 

    task :second_task => :environment do 
      server_name='myserver' 
      do_something_with(server_name) 
    end 
end 

जैसा कि आप देख, दोनों कार्यों एक ही नाम स्थान तहत कर रहे हैं और दोनों ही कार्यों server_name='myserver'लगातार चर का उपयोग

यह वास्तव में उसी नामस्थान के नीचे server_name वैरिएबल को परिभाषित करने के लिए बदसूरत लग रहा है, मेरे पास इस चर को परिभाषित करने वाला एक स्थान कैसे हो सकता है ताकि दोनों कार्य इसका उपयोग कर सकें?

उत्तर

14

इस प्रयास करें:

namespace :db do 
    server_name='myserver' 
    task :first_task => :environment do 
    connect_to(server_name) 
    end 

    task :second_task => :environment do 
    do_something_with(server_name) 
    end 
end 

नेमस्पेस चर उनके कार्यक्षेत्र से पहले घोषित की पहुंच है।

6

मैं David Sulc's answer पर निर्माण करना चाहते हैं, लेकिन मैं एक उदाहरण चर का उपयोग करना चाहिये बजाय:

namespace :db do 
    @server_name = 'myserver' 

    task first_task: :environment do 
    connect_to @server_name 
    end 

    task second_task: :environment do 
    do_something_with @server_name 
    end 
end 

लाभ यहां बाद में कोड को संशोधित कर सकते हैं कि @server_name है - कुछ आप एक स्थानीय के साथ ऐसा नहीं कर सकते परिवर्तनीय:

namespace :db do 
    @server_name = 'server_2' 
end 
+0

नहीं, आपको ऐसा नहीं करना चाहिए। कारण यह है कि आप नहीं जानते, जहां वह ivar जाता है। न तो मैं करता हूं। एक रेक का उपयोग एक ब्लॉक का उपयोग करके घोषित किया जाता है, न कि वर्ग, और इसलिए इवर का संदर्भ अस्पष्ट है। – meandre

+0

@meandre इस तरह से एक आवृत्ति चर का उपयोग करने में समस्या क्या है? क्या आप दिखा सकते हैं कि यह गलत कहां जा सकता है? क्या आपके पास एक बेहतर सुझाव है? अधिक विस्तृत चर्चा के लिए http://daneharrigan.com/2010/06/rake-tasks-102/ में "कार्य में इंस्टेंस वैरिएबल" अनुभाग देखें। –

+0

@meandre असल में, उदाहरण के रूप में परिभाषित उदाहरण चर 'Rake.application.in_namespace (नाम, और ब्लॉक)' के संदर्भ में मूल्यांकन किया गया है (https://github.com/jimweirich/rake/blob/v10.3.2 देखें /lib/rake/dsl_definition.rb#L140)। मुझे यकीन नहीं है कि आपकी चिंता क्या है। –

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