如何在Rails中修复/调试"预期的x.rb以定义X.rb"

时间:2020-03-06 14:22:06  来源:igfitidea点击:

我已经看到此问题出现在许多不同的情况下,并希望获得在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)",问题就消失了。

我希望这有帮助。