2010-11-11 11 views
5

Est-il possible d'appeler une tâche spécifique en premier lorsque je lance une tâche thor?Ruby - Thor exécute une tâche spécifique en premier

mon 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 

Je pourrais écrire la méthode « connect_to_database » dans chaque tâche, mais qui ne semble pas très sec.

Répondre

10

Vous pouvez utiliser invoke pour exécuter d'autres tâches:

def show_version 
    invoke :connect_to_database 
    # ... 
end 

Cela va également vous assurer qu'ils sont exécutés qu'une seule fois, sinon vous pouvez simplement appeler la méthode comme d'habitude, par exemple

def show_version 
    connect_to_database 
    # ... 
end 

Ou vous pouvez ajouter l'appel au constructeur, de le faire tourner d'abord dans chaque invocation:

def initialize(*args) 
    super 
    connecto_to_database 
end 

L'appel à super est très important, sans qu'il Thor aura aucune idée de quoi faire.

+0

Je souhaite écrire l'appel à "connect_to_database" une seule fois. comme si vous l'écrivez dans une classe régulière dans le constructeur – ipsum

+1

Essayez d'ajouter un constructeur: 'def initialize (* args); super; connecto_to_database; fin – Theo

+0

Merci Theo fonctionne très bien :) – ipsum

1

Une caractéristique plutôt sous-documentée de thor est la méthode default_task. Passé un symbole à partir de votre script thor, vous pouvez le définir pour exécuter une tâche spécifique et, en utilisant invoke, exécuter d'autres thatks.

-à-dire:

default_task: connect_to_database;