我想从delayed_job运行一个rake任务(apn:notifications:从apn_on_rails gem传递)。换句话说,我想将一个延迟的工作排入队列,这个工作将调用apn:notifications:提供rake任务。
我在http://pastie.org/157390找到了此代码http://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:notifications:deliver”失败。不知道如何构建任务'apn:notifications:deliver'
如何让它了解apn_on_rails?我试过在DelayedRake的顶部要求'apn_on_rails_tasks',它没有做任何事情。我还尝试将rake任务目录更改为./lib/tasks / *。rake
我对Ruby / Rails有些新意。这是在heroku上运行的2.3.5。
答案 0 :(得分:8)
为什么不进行系统调用?
system "rake apn:notifications:deliver"
答案 1 :(得分:2)
我相信如果你把它称为一个单独的过程会更容易。请参阅5 ways to run commands from Ruby。
def perform
`rake -f #{Rails.root.join("Rakefile")} #{@task}`
end
如果要捕获任何错误,则应捕获STDERR
,如文章中所示。