2009-07-23 14 views
63

Chciałbym uruchomić zadanie rake w moim kontrolerze. Czy jest jakiś sposób to zrobić?Uruchom zadanie rake w kontrolerze

+1

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

+5

spróbuj tego >> 'system" rake nazwa_zadania "' – Bongs

+0

Ryan Bates obejmuje [kilka sposobów] (http://railscasts.com/odcinki/127-prowizji w tle) w odcinku RailsCasts nr 127. –

Odpowiedz

49

Nie uważam za dobry sposób wywołania zadania rake w kodzie. Zalecam umieszczenie kodu zadania, które chciałbyś wykonać gdzieś poza zadaniem rake, i zlecenie rake wywołaj ten kod.

Ma to nie tylko tę zaletę, że można łatwo wywołać prowizję zewnętrzną (co jest potrzebne), ale także znacznie ułatwia testowanie zadania rake.

+6

+1 Zgadzam się: jest to doskonały przykład rzeczy, które powinny być refaktoryzowane i wywoływane na dwa różne sposoby. –

+7

http://railscasts.com/episodes/127-rake-in-background Wydaje się być doskonałym powodem do uruchomienia prowizji. – baash05

+4

Gdzie byłoby dobre "gdzieś" być "gdzieś poza zadaniem prowizji"? – user456584

16

Można to zrobić w kontrolerze:

%x[rake name_task] 

z: name_task jest nazwa zadania

+2

w jaki sposób przekazujesz do niego otoczenie? – serengeti12

+3

Nigdy nie wywaliłbym się na zgrabianie z kontrolera podczas produkcji. – Duke

+14

@Duke przy odpowiedzi lub komentarzu możesz również wyjaśnić swoje rozumowanie, a nie tylko twierdzić (że kontroler w produkcji nie powinien wywoływać zadań rake)? Pomogłoby to zrozumieć twoje rozumowanie, zamiast tylko wiedzieć, czego nie zrobiłbyś (ale nie usłyszałeś twojego wyjaśnienia, dlaczego). – Matt

55

zgadzam się z ddfreynee, ale w przypadku, gdy wiemy, co trzeba kod może wyglądać następująco:

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 

Zamiast tego można wymagać "rake" i .load_tasks w inicjalizatorze.

+0

Gdzie mogę dowiedzieć się, jaka jest moja "nazwa aplikacji"? – pdxleif

+0

@pxdleif Jest w 'config/application.rb' jako nazwa modułu około 12 linii w dół, zakładając, że używasz Rails. –

+1

Możesz także odwołać się do aplikacji, wywołując 'Rails.application' – declan

8

Zamiast próbować wywoływać zadanie rake w kontrolerze, wywołuj obiekty usługi zawierające dowolną logikę, którą próbujesz wykonać.

class SomeController < ApplicationController 
    def whatever 
    SomeServiceObject.call 
    end 
end 

... a potem, zakładając, że mówimy o zadaniu zwyczaj natarcia, które to wywołać obiekt serwisowy, a także:

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

w przypadku, gdy nie są zaznajomieni z obiektów usługowych, oni są zwykłymi klasami ruby, które wykonują określoną pracę. Jeśli próbujesz wywołać niektóre z domyślnych zadań rake (np .: db: migrate), zdecydowanie nie polecam tego typu rzeczy z kontrolera.

+0

To jest bardzo czysty sposób robienia tego. Dzięki. – juliangonzalez

Powiązane problemy