我已经实现了一个独立功能的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'
答案 0 :(得分:4)
从控制器won't work调用self.delay
方法,因为DJ会尝试将控制器序列化为作业。您最好创建一个类来处理您的任务,然后将其方法标记为异步:
class AsyncTask
def run
system('ruby my_script.rb')
end
handle_asynchronously :run
end
在您的控制器中:
def create
...
AsyncTask.new.run
...
end
请参阅readme的“排队作业”部分中的第二个示例。
答案 1 :(得分: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"))