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 

delay_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,例如,在 shell 脚本或命令行中。换句话说, bundle exec rails runner 都是命令和命令的参数,而不是 ruby​​ 方法或变量。runner 是在您的 perform 方法中评估的第一个表达式,因此您的错误。
  • rails runner 只是调出您的应用程序环境并评估给定的字符串或路径参数。
  • 请注意执行任务中的 account_id,我猜是您的代码中的另一个错误。

您想要做的可能是一个简单的系统调用。

看来你的大虾脚本需要环境,所以只需调用

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

不会工作。

现在,您肯定可以使用项目目录中的 runner 执行脚本。

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 回答