如何在Rails中修复/调试"预期的x.rb以定义X.rb"
我已经看到此问题出现在许多不同的情况下,并希望获得在StackOverflow上修复/调试它的最佳实践。
举一个现实世界的例子,这是今天早上发生在我身上的:
expected announcement.rb to define Announcement
该类在开发,测试和生产控制台中都表现良好,但在生产Mongrel中失败了。这是课程:
class Announcement < ActiveRecord::Base has_attachment :content_type => 'audio/mp3', :storage => :s3 end
我想在答案中解决的问题并不能解决这个特定问题,但是如何正确调试以使Rails像预期的x.rb定义X.rb'一样给我们带来有意义的错误,这通常是一个红色的鲱鱼。 。
编辑(到目前为止,有3个好答案,每个都有部分解决方案)
调试:
- 来自Joe Van Dyk的文章:尝试通过导致错误的环境/实例上的控制台访问模型(在上述情况下:脚本/控制台生产,然后键入"公告"。
- 从奥托(Otto):尝试通过初始化程序设置最小插件集,例如:config.plugins = [:exception_notification,:ssl_requirement,:all],然后一次重新启用一个。
具体原因:
- 来自伊恩·特雷尔(Ian Terrell)的信息:如果我们使用的是Attachment_fu,请确保已安装正确的图像处理器。即使我们没有添加图片,attachment_fu也将需要它。
- 在Otto中:确保没有命名与内置Rails类冲突的模型,例如:Request。
- 来自Josh Lewis:确保应用程序(或者Gem列表)中没有重复的类或者模块名称。
解决方案
那是一个棘手的问题。
通常,对我有用的是在生产服务器上运行"脚本/控制台生产",然后输入:
公告
通常,这将为我们提供更好的错误消息。但是你说你已经尝试过了吗?
我以前遇到过这个,而AttachmentFu
插件应该被指责。我认为我的情况是由于AttachmentFu
期望的图像处理器不同于可用的图像处理器,或者还安装了不支持的版本。当我向" has_attachment"方法调用中显式添加:with =>:rmagick
(或者类似的-我正在使用RMagick)时,即使对于非图像附件,该问题也得以解决。显然,请确保生产环境中安装了所有正确的gem(或者将它们冻结到应用程序中)和支持软件(ImageMagick)。 YMMV。
至于没有让Rails和AttachmentFu吸收并隐藏真正的错误-我们在完全弄清楚它之前将其修复。
我们可以尝试禁用所有插件,然后将它们一个接一个地添加。
在Initalizer部分的environment.rb
中,添加如下一行:
config.plugins = [ :exception_notification, :ssl_requirement, :all ]
从最低设置开始运行应用程序,然后将它们一个接一个地添加。当我定义了一个恰好映射到现有文件名的模型时,通常会出现此错误。例如,一个Request模型,但是Rails已经有一个request.rb,它首先被加载。
我有一段时间这个问题,在我的情况下,该错误总是始于此S3错误:
(AWS::S3::Operation Aborted) "A conflicting conditional operation is currently in progress against this resource. Please try again."
一遍又一遍地创建相同的存储桶时,通常会出现此问题。 (来源AWS开发人员论坛)
这是因为我使用了attachment_fu创建存储桶,并对lib / technoweenie / attachment_fu / backends / s3_backends.rb中包含命令Bucket.create(@@ bucket_name)的行进行了注释。 (靠近第152行)。
一旦注释或者删除了命令" Bucket.create(@@ bucket_name)",问题就消失了。
我希望这有帮助。