Rails生成服务器失败,因为它调用了一个不应该调用的脚本

时间:2014-02-13 17:01:33

标签: ruby-on-rails ruby-on-rails-3

我有一个在开发模式下工作正常的Rails项目但是当我运行rails s -e production时,它失败并带有

/home/dgriffith/codem-schedule/app/workers/combine.rb:7:in `<top (required)>': undefined method `casecmp' for nil:NilClass (NoMethodError)
...(I can post the rest if needed)...

此错误会导致如果combine.rb正在运行但应该是。{

combine.rb

uploadDir = ARGV.shift
uploadName = ARGV.shift
fileExtension = ARGV.shift

require 'pubnub'

if fileExtension.casecmp("MTS") == 0
....
end

这是一个工作人员,当我发布了一些内容时,我会从我的控制器中调用它。我称之为:

pid = spawn("ruby #{Rails.root.join('app','workers', 'reconstructUploads.rb')} #{Rails.root.to_s} #{params[:fileName]} #{params[:uploadName]} #{params[:numberOfFiles]}")
Process.detach(pid)

这应该真的很重要,因为它没有被执行。该脚本由服务器运行。

就像我说的,这一切在开发模式下都能正常工作。如果没有发送params,脚本将无法工作,但绝不应该这样,因为唯一应该调用它的是控制器。

我自己创造了这个工人,我不知道Rails打算如何处理它们。我还在app下创建了workers目录。我什么都找不到,告诉我这是一个坏主意。

在退出上述错误之前,这就是它所说的全部内容:

dustingriffith:project/ (branch*) $ rails s -e production
=> Booting WEBrick
=> Rails 3.2.16 application starting in production on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
Exiting

为什么要执行此脚本?如何防止它抛出错误?

1 个答案:

答案 0 :(得分:1)

启动rails服务器时,正在运行所有代码以创建必要的类,模块等。

因此,您的工作文件也会被调用,并且会引发错误。

此问题仅出现在生产模式中,因为在开发rails中,可以延迟加载文件,以支持在服务器运行时自动更新正在更改的文件。

我认为,您可以将文件移动到lib文件夹并根据需要运行。它应该可以解决问题,因为在启动时rails不会自动加载lib文件夹。