2010-11-11 15 views
5

¿Es posible llamar primero a una tarea específica cuando ejecuto una tarea thor?Ruby - Thor ejecuta una tarea específica primero

mi 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 

podría escribir el método "connect_to_database" en cada tarea, pero eso no parece muy seco.

Respuesta

10

Puede utilizar invoke para ejecutar otras tareas:

def show_version 
    invoke :connect_to_database 
    # ... 
end 

Eso también se asegurará de que se ejecutan una sola vez, de lo contrario sólo se puede llamar al método como es habitual, por ejemplo,

def show_version 
    connect_to_database 
    # ... 
end 

O podría añadir la llamada al constructor, para que se ejecute por primera vez en cada invocación:

def initialize(*args) 
    super 
    connecto_to_database 
end 

La llamada a super es muy importante, sin ella Thor tendrá ni idea de qué hacer.

+0

Quiero escribir la llamada a "connect_to_database" solo una vez. como si lo escribiera en una clase normal en el constructor – ipsum

+1

Intente agregar un constructor: 'def initialize (* args); súper; connecto_to_database; end' – Theo

+0

Gracias Theo funciona muy bien :) – ipsum

1

Una característica más bien documentada de thor es el método default_task. Pasó un símbolo desde su script thor, puede configurarlo para ejecutar una tarea específica y, utilizando invoke, ejecutar otros thatks.

es decir:

default_task: connect_to_database;

Cuestiones relacionadas