0

Delayed_jobでPrawnスクリプトを実行するにはどうすればよいですか。

(現在 Bj を使用していますが、Rails3 ではサポートされていません)

このコードは機能しません。

/lib/report_job.rb

class ReportJob < Struct.new(:prawn_script_name , :account_id )
      def perform
       bundle exec rails runner "#{Rails.root}/jobs/#{prawn_script_name}.rb #{@current_user.account_id} " 
  end

/reports_controller.rb

def generate_report(prawn_script_name)
    Delayed::Job.enqueue(ReportJob.new("#{prawn_script_name}.rb","#{@current_user.account_id}"))
end 

delayed_job テーブルが期待どおりに読み込まれます。

--- !ruby/struct:ReportJob 
prawn_script_name: statements.rb
account_id: '18' 

Error in last_error field. 
{undefined method `runner' for ReportJob:0xc28f080 

助言がありますか?

4

1 に答える 1

1

ここにはいくつかの誤解があると思います:

  • シェル スクリプトやコマンド ラインなど、アプリの外部から runner を呼び出すつもりでした。つまり、bundle exec rails runner はすべてコマンドとコマンドの引数であり、Ruby のメソッドや変数ではありません。runner は、実行メソッド内で評価される最初の式であるため、エラーになります。
  • rails runner は単にアプリ環境を起動し、指定された文字列またはパス引数を評価します。
  • perform タスク内の account_id に注意してください。コードの別の間違いだと思います。

あなたがやりたかったことは、単純なシステムコールかもしれません。

あなたのエビのスクリプトには環境が必要なようです。

system "ruby #{Rails.root}/jobs/#{prawn_script_name}.rb #{account_id}"

動作しません。

これで、プロジェクト ディレクトリからランナーを使用してスクリプトを確実に実行できます。

system "bundle exec rails runner #{Rails.root}/jobs/#{prawn_script_name}.rb  #{account_id}"

ただし、環境内でシステム コールを介してこれを行うのは非常に冗長です。遅延ジョブはすでに Rails 環境にアクセスできます。単純にロードするだけです。

class ReportJob < Struct.new(:prawn_script_name , :account_id )
   def perform
      load "#{Rails.root}/jobs/#{prawn_script_name}.rb"
   end
end

お役に立てれば

于 2012-06-07T12:01:46.197 に答える