2010-11-11 3 views
5

Можно ли вызвать конкретную задачу во-первых, когда я запускаю топорную задачу?Ruby - Thor выполнить конкретную задачу сначала

мой 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 

Я мог бы написать "connect_to_database" метод в каждой задаче, но это, кажется, не очень DRY.

ответ

10

Вы можете использовать invoke для выполнения других задач:

def show_version 
    invoke :connect_to_database 
    # ... 
end 

Это будет также убедиться, что они работают только один раз, в противном случае вы можете просто вызвать метод, как обычно, например,

def show_version 
    connect_to_database 
    # ... 
end 

Или вы могли бы добавить вызов конструктора, чтобы запустить его сначала в каждом вызове:

def initialize(*args) 
    super 
    connecto_to_database 
end 

Вызов super очень важен, без него Тор не будет иметь ни малейшего представления о том, что делать.

+0

Я хочу написать вызов «connect_to_database» только один раз. как вы бы записывали его в обычный класс в конструкторе – ipsum

+1

Попробуйте добавить конструктор: 'def initialize (* args); супер; connecto_to_database; end' – Theo

+0

Спасибо, Тео отлично работает :) – ipsum

1

Достаточно задокументированная функция тора - метод default_task. Пропустив символ из вашего скрипта, вы можете настроить его для запуска конкретной задачи и, используя invoke, запустить другие этики.

т.е.

default_task: connect_to_database;

Смежные вопросы