2010-11-11 7 views
5

Ist es möglich, eine bestimmte Aufgabe zuerst aufzurufen, wenn ich eine Thor-Aufgabe ausführen?Ruby - Thor eine bestimmte Aufgabe zuerst ausführen

mein Thorfile:

class Db < Thor 

    desc "show_Version", "some description ..." 
    def show_version # <= needs a database connection 
    puts ActiveRecord::Migrator.current_version 
    end 

    private 

    def connect_to_database # <= call this always when a task from this file is executed 
    # connect here to database 
    end 

end 

Ich konnte die "connect_to_database" -Methode in jeder Aufgabe schreiben, aber das scheint nicht sehr trocken.

Antwort

10

Sie können invoke verwenden, um andere Aufgaben auszuführen:

def show_version 
    invoke :connect_to_database 
    # ... 
end 

, die auch dafür sorgen, dass sie nur einmal ausgeführt werden, sonst kann man nur das Verfahren, wie üblich nennen, z.B.

def show_version 
    connect_to_database 
    # ... 
end 

Oder man könnte den Anruf an den Konstruktor hinzufügen, um es zuerst in jedem Aufruf haben läuft:

def initialize(*args) 
    super 
    connecto_to_database 
end 

Der Aufruf von super sehr wichtig ist, ohne es Thor wird keine Ahnung, was zu machen.

+0

Ich möchte den Aufruf von "connect_to_database" nur einmal schreiben. wie Sie es in einer regulären Klasse im Konstruktor schreiben würden – ipsum

+1

Versuchen Sie, einen Konstruktor hinzuzufügen: 'def initialize (* args); Super; connecto_to_database; Ende' – Theo

+0

Danke Theo funktioniert super :) – ipsum

1

Ein eher unter dokumentiertes Merkmal von Thor ist die Methode default_task. Wenn Sie ein Symbol aus Ihrem thor-Skript übergeben, können Sie festlegen, dass eine bestimmte Aufgabe ausgeführt wird, und mithilfe von invoke andere thaks ausführen.

dh:

default_task: connect_to_database;

Verwandte Themen