我有一个在开发模式下工作正常的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
为什么要执行此脚本?如何防止它抛出错误?
答案 0 :(得分:1)
启动rails服务器时,正在运行所有代码以创建必要的类,模块等。
因此,您的工作文件也会被调用,并且会引发错误。
此问题仅出现在生产模式中,因为在开发rails中,可以延迟加载文件,以支持在服务器运行时自动更新正在更改的文件。
我认为,您可以将文件移动到lib文件夹并根据需要运行。它应该可以解决问题,因为在启动时rails不会自动加载lib文件夹。