2010-11-11 4 views
5

È possibile chiamare prima un'attività specifica, quando eseguo un'attività Thor?Ruby - Thor esegue prima una specifica attività

mia 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 

potrei scrivere il metodo "connect_to_database" in ogni attività, ma che non sembra molto secca.

risposta

10

È possibile utilizzare invoke per eseguire altri compiti:

def show_version 
    invoke :connect_to_database 
    # ... 
end 

che sarà anche assicurarsi che essi vengono eseguiti una sola volta, in caso contrario si può chiamare il metodo, come al solito, per esempio

def show_version 
    connect_to_database 
    # ... 
end 

Oppure si potrebbe aggiungere la chiamata al costruttore, per fare eseguire prima in ogni invocazione:

def initialize(*args) 
    super 
    connecto_to_database 
end 

La chiamata a super è molto importante, senza di essa Thor avrà alcuna idea di cosa fare.

+0

Voglio scrivere la chiamata a "connect_to_database" solo una volta. come se dovessi scrivere in una classe normale nel costruttore – ipsum

+1

Prova ad aggiungere un costruttore: 'def initialize (* args); super; connecto_to_database; fine' – Theo

+0

Grazie Theo funziona benissimo :) – ipsum

1

Una funzione piuttosto documentata di thor è il metodo default_task. Passato un simbolo dal tuo script thor, puoi impostarlo per eseguire un'attività specifica e, usando invoke, eseguire altri programmi.

cioè:

default_task: connect_to_database;