2

独立した機能として実装された ruby​​ スクリプトがあります。ここで、このスクリプトを自分の Rails 環境で実行したいと思います。処理に多くの時間が必要なため、バックグラウンド ジョブとして実行することはさらに困難です。

delayed_job gem を追加した後、次の文を呼び出してみました。

delay.system("ruby my_script.rb")

そして、これは私が得るエラーです:

Completed 500 Internal Server Error in 95ms
TypeError (can't dump anonymous module: #<Module:0x007f8a9ce14dc0>):
   app/controllers/components_controller.rb:49:in `create'
4

2 に答える 2

4

DJがコントローラーをジョブにシリアル化しようとするため、self.delayコントローラーからメソッドを呼び出すことはできません。タスクを処理するクラスを作成してから、そのメソッドに非同期のフラグを立てる方がよいでしょう。

class AsyncTask
  def run
    system('ruby my_script.rb')
  end
  handle_asynchronously :run
end

コントローラ内:

def create
    ...
    AsyncTask.new.run
    ...
end

readmeの「QueingJobs」セクションの2番目の例を参照してください。

于 2012-11-13T11:06:38.957 に答える
0

Jef が述べたように、最善の解決策はカスタム ジョブを作成することです。Jefの答えの問題は、その構文(私が知る限り)が正しくなく、それが彼の仕事で単一のシステムコマンドを処理することですが、次の方法でより多くのカスタマイズが可能になります。

# lib/system_command_job.rb
class SystemCommandJob < Struct.new(:cmd)
  def perform
    system(cmd)
  end
end

Struct 初期化子の cmd 引数に注意してください。引数をジョブに渡すことができるため、コードは次のようになります。

Delayed::Job.enqueue(SystemCommandJob.new("ruby my_script.rb"))
于 2012-11-13T11:20:42.087 に答える