【问题标题】:Delayed_job and Prawn scriptsDelayed_job 和 Prawn 脚本
【发布时间】:2012-06-07 10:49:38
【问题描述】:

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

有什么建议吗?

【问题讨论】:

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


    【解决方案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
    

    希望对你有帮助

    【讨论】:

    • 加载命令起作用并“运行”虾脚本。但是,我需要将参数传递给大虾脚本,例如 account_id 来确定 pdf 报告的数据范围。这是我要克服的下一个障碍。
    • 你不能把你的各种脚本放到一个类和一个方法调用中吗?这些脚本是从哪里来的,不能一概而论吗?
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多