2010-11-15 3 views
5

'dan nasıl bir komisyon görevi yürütebilirim Bir komisyon görevini çalıştırmak istiyorum (apn: bildirimler: apn_on_rails geminden teslim etmek) bir delayed_job'den. Diğer bir deyişle, apn: bildirimlerini çağırabilecek gecikmeli bir işi yapmak istiyorum: komisyon görevini teslim et.Bir delaye_job

http://geminstallthat.wordpress.com/2008/02/25/run-rake-tasks-with-delayedjob-dj/ numaralı telefondan bu kodu http://pastie.org/157390 buldum. delayed_job koşular kadar

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 

Her şey iyi çalışır ve onu şikayet:

benim lib dizinine DelayedRake.rb olarak bu kodu eklenmiş

[HATA]: Görev "apn: bildirimleri: teslim " başarısız oldu. Nasıl yapılacağını bilmiyorum görev 'apn: bildirimler: teslim et'

Apn_on_rails hakkında nasıl bilgilendiririm? Bir şey yapmayan DelayedRake'in tepesinde 'apn_on_rails_tasks' gerektirmeyi denedim. Ayrıca tırmık görevlerin dizin

Ben Ruby/Rails biraz yeniyim ./lib/tasks/*.rake değiştirmeyi denedi. Bu heroku üzerinde 2.3.5 üzerinde çalışıyor.

cevap

6

Neden sadece sistem çağrısı yapmıyorsunuz?

system "rake apn:notifications:deliver" 
+0

Bu harika çalıştı! Görevlere @options nasıl gönderirim? Şu anda arıyorum: – rmw

+0

sistemi "tırmık # {@ görev}" Ben "tırmık # {@ görev} # {@ seçenekleri}" sistemini yapabilirdi? – rmw

1

Bunu ayrı bir işlem olarak adlandırırsanız daha kolay olduğuna inanıyorum. Bakınız 5 ways to run commands from Ruby. Herhangi bir hata yakalamak istiyorsanız makalesinde gösterildiği gibi

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

, sen STDERR yakalamak gerekir.