2010-11-15 277 views
5

我想从delayed_job运行rake任务(apn:notifications:从apn_on_rails gem提供)。换句话说,我想入队一个延迟的工作,它会调用apn:notifications:传递rake任务。我如何从delayed_job运行rake任务

我发现这个代码http://pastie.org/157390http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/

我加入这个代码DelayedRake.rb到我的lib目录:

require 'rake' 
require 'fileutils' 

class DelayedRake 
    def initialize(task, options = {}) 
    @task  = task 
    @options = options 
end 

    ## 
    # Called by Delayed::Job. 
    def perform 
    FileUtils.cd RAILS_ROOT 

    @rake = Rake::Application.new 
    Rake.application = @rake 
    ### Load all the Rake Tasks. 
    Dir[ "./lib/tasks/**/*.rake" ].each { |ext| load ext } 
    @options.stringify_keys!.each do |key, value| 
     ENV[key] = value 
    end 
    begin 
     @rake[@task].invoke 
    rescue => e 
     RAILS_DEFAULT_LOGGER.error "[ERROR]: task \"#{@task}\" failed. #{e}" 
    end 
end 
end 

一切都正常运行,直到delayed_job的运行,并抱怨:

[错误]:任务“APN:通知:提供“失败。不知道如何构建任务'apn:notifications:deliver'

如何让它知道apn_on_rails?我曾尝试在DelayedRake的顶部请求'apn_on_rails_tasks',它没有做任何事情。我也尝试将rake任务的目录更改为./lib/tasks/*.rake

我对Ruby/Rails有点新鲜。这在heroku上运行在2.3.5上。

回答

6

为什么不做一个系统调用?

system "rake apn:notifications:deliver" 
+0

这很棒!我将如何发送@options到任务?现在我打电话: – rmw 2010-11-15 16:34:24

+0

系统“耙#{@任务}”我可以做系统“耙#{@任务}#{@选项}”? – rmw 2010-11-15 16:34:59

1

我相信如果你把它作为一个单独的过程来调用它会更容易。见5 ways to run commands from Ruby

def perform 
    `rake -f #{Rails.root.join("Rakefile")} #{@task}` 
end 

如果你想捕捉任何错误,如在文章中,你应该捕获STDERR