2010-11-11 21 views
5

Có thể gọi một nhiệm vụ cụ thể trước, khi tôi chạy một tác vụ thor?Ruby - Thor thực hiện một nhiệm vụ cụ thể trước tiên

Thorfile tôi:

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 

tôi có thể viết phương pháp "connect_to_database" trong mọi công việc nhưng điều đó dường như không phải là rất khô.

Trả lời

10

Bạn có thể sử dụng invoke để chạy các nhiệm vụ khác:

def show_version 
    invoke :connect_to_database 
    # ... 
end 

Đó cũng sẽ đảm bảo rằng họ đang chạy chỉ một lần, nếu không bạn có thể chỉ cần gọi phương thức như thường lệ, ví dụ

def show_version 
    connect_to_database 
    # ... 
end 

Hoặc bạn có thể thêm các cuộc gọi đến các nhà xây dựng, để có nó chạy đầu tiên trong mỗi invocation:

def initialize(*args) 
    super 
    connecto_to_database 
end 

Các cuộc gọi đến super là rất quan trọng, nếu không có nó Thor sẽ không có ý tưởng gì để làm.

+0

tôi chỉ muốn gửi lệnh gọi đến "connect_to_database" một lần. như bạn sẽ viết nó trong một lớp thông thường trong hàm tạo – ipsum

+1

Thử thêm một hàm tạo: 'def initialize (* args); siêu; connecto_to_database; end' – Theo

+0

Cảm ơn Theo tác phẩm tuyệt vời :) – ipsum

1

Một tính năng được ghi lại dưới dạng tài liệu của thor là phương thức default_task. Thông qua một biểu tượng từ bên trong kịch bản lệnh thor của bạn, bạn có thể thiết lập nó để chạy một nhiệm vụ cụ thể và, bằng cách sử dụng gọi, chạy các loại khác.

tức là:

default_task: connect_to_database;

Các vấn đề liên quan