2009-07-23 15 views
63

में रेक रेक कार्य चलाएं मैं अपने नियंत्रक में एक रेक कार्य चलाने के लिए चाहता हूं। क्या इसे करने का कोई तरीका है?नियंत्रक

+1

http://railscasts.com/episodes/127-rake-in-background – baash05

+5

इसे आजमाएं >> 'सिस्टम "रेक कार्य_नाम" ' – Bongs

+0

रायन बेट्स [कुछ तरीकों से ढंका] (http://railscasts.com/एपिसोड/127-रेक-इन-बैकग्राउंड) RailsCasts एपिसोड # 127 में। –

उत्तर

49

मुझे कोड में रेक रेक को कॉल करने के लिए अच्छी शैली नहीं मिलती है। मैं उस कार्य के लिए कोड डालने की अनुशंसा करता हूं जिसे आप किसी रेक कार्य के बाहर कहीं निष्पादित करना चाहते हैं, और रेक कोड को इस कोड को कॉल करें।

यह न केवल बाहरी रेक (जो आप चाहते हैं) को कॉल करने में आसान होने का लाभ है, लेकिन यह रेक कार्य का परीक्षण करना भी अधिक आसान बनाता है।

+6

+1 मैं सहमत हूं: यह उन चीजों का एक आदर्श उदाहरण है जिन्हें दो अलग-अलग तरीकों से दोबारा संशोधित किया जाना चाहिए। –

+7

http://railscasts.com/episodes/127-rake-in-background एक रेक चलाने के लिए एक उत्कृष्ट कारण लगता है .. – baash05

+4

"कहीं भी" कहीं भी "कहीं भी" रेक के बाहर कहीं "होगा? – user456584

16

आप अपने नियंत्रक में ऐसा कर सकते हैं:

%x[rake name_task] 

साथ: name_task अपने कार्य

+2

आप इसे पर्यावरण कैसे पास करते हैं? – serengeti12

+3

मैं उत्पादन में अपने नियंत्रक से रेक करने के लिए कभी बाहर नहीं खोलूंगा। – Duke

+14

@Duke जब आप उत्तर देते हैं या टिप्पणी करते हैं तो क्या आप अपनी तर्क को भी समझा सकते हैं और न सिर्फ एक दावा कर सकते हैं (कि उत्पादन में नियंत्रक को रेक कार्यों को कॉल नहीं करना चाहिए)? इससे लोगों को यह जानने के बजाय लोगों को आपकी तर्क समझने में मदद मिलेगी कि आप क्या नहीं करेंगे (लेकिन क्यों नहीं बल्कि आपकी व्याख्या सुन रहे हैं)। – Matt

55

मैं ddfreynee से सहमत का नाम है, लेकिन मामले में आप जानते हैं कि आपको क्या चाहिए कोड की तरह लग सकता है:

require 'rake' 

Rake::Task.clear # necessary to avoid tasks being loaded several times in dev mode 
Sample::Application.load_tasks # providing your application name is 'sample' 

class RakeController < ApplicationController 

    def run 
    Rake::Task[params[:task]].reenable # in case you're going to invoke the same task second time. 
    Rake::Task[params[:task]].invoke 
    end 

end 

इसके बजाय आपको प्रारंभकर्ता में 'रेक' और .load_tasks की आवश्यकता हो सकती है।

+0

मुझे पता चल जाएगा कि मेरा "एप्लिकेशन नाम" क्या है? – pdxleif

+0

@pxdleif यह 'कॉन्फ़िगरेशन/application.rb' में मॉड्यूल नाम के रूप में 12 लाइनों के नीचे है, मान लीजिए कि आप रेल का उपयोग कर रहे हैं। –

+1

आप 'Rails.application' – declan

8

नियंत्रक में रेक कार्य को कॉल करने का प्रयास करने के बजाय, एक सेवा ऑब्जेक्ट्स को कॉल करें जिसमें आप जो भी तर्क निष्पादित करने का प्रयास कर रहे हैं उसे शामिल करें।

class SomeController < ApplicationController 
    def whatever 
    SomeServiceObject.call 
    end 
end 

... और फिर, आप यह सोचते हैं एक कस्टम रेक कार्य के बारे में बात कर रहे हैं, है यह सेवा वस्तु के रूप में अच्छी तरह से कहते हैं:

namespace :example do 
    desc 'important task' 
    task :important_task do 
    SomeServiceObject.call 
    end 
end 

मामले में आप वे, सेवा वस्तुओं से परिचित नहीं हैं केवल सादे पुराने रूबी वर्ग हैं जो एक विशिष्ट नौकरी करते हैं। यदि आप कुछ डिफ़ॉल्ट रेक कार्यों को कॉल करने का प्रयास कर रहे हैं (यानी: डीबी: माइग्रेट) मैं अत्यधिक नियंत्रक से उस तरह की चीज़ न करने की अनुशंसा करता हूं।

+0

यह करने का यह एक बहुत ही साफ तरीका है। धन्यवाद। – juliangonzalez