Delayed_job和Prawn脚本

时间:2012-06-07 10:49:39

标签: ruby-on-rails delayed-job prawn

如何使用 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 

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我认为这里存在一些误解:

  • 您打算从应用程序外部调用运行程序,例如,在shell脚本或命令行中。换句话说,bundle exec rails runner是命令的所有命令和参数,而不是ruby方法或变量。 runner是你的perform方法中第一个被eval'd的表达式,因此你的错误。
  • rails runner会调出你的应用程序环境,并且会破坏给定的字符串或路径参数。
  • 注意执行任务中的account_id,我猜你的代码中的另一个错误。

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

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

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

希望这会有所帮助