【问题标题】:How to fix / debug 'expected x.rb to define X.rb' in Rails如何在 Rails 中修复/调试'expected x.rb to define X.rb'
【发布时间】:2008-09-18 15:55:46
【问题描述】:

我已经看到这个问题在许多不同的情况下出现,并希望获得在 StackOverflow 上修复/调试它的最佳实践。

举一个我今天早上想到的现实世界的例子:

expected announcement.rb to define Announcement

该类在开发中运行良好,从生产控制台测试和,但在生产 Mongrel 中失败了。这是课程:

class Announcement < ActiveRecord::Base
  has_attachment :content_type => 'audio/mp3', :storage => :s3
end

我想在答案中解决的问题与其说是解决这个特定问题,不如说是如何正确调试以使 Rails 像预期的那样为您提供有意义的错误 x.rb to define X.rb' 通常是红色的鲱鱼...

编辑(到目前为止 3 个很好的响应,每个都有部分解决方案)

调试:

  1. 来自 Joe Van Dyk:尝试通过导致错误的环境/实例上的控制台访问模型(在上述情况下:脚本/控制台生产,然后输入“公告”。

  2. 来自 Otto:尝试通过初始化程序设置一个最小插件集,例如:config.plugins = [ :exception_notification, :ssl_requirement, :all ] 然后一次重新启用一个。

    李>

具体原因:

  1. 来自 Ian Terrell:如果您使用的是 attachment_fu,请确保安装了正确的图像处理器。即使您没有附加图片, attachment_fu 也会需要它。

  2. 来自 Otto:确保您没有命名与内置 Rails 类冲突的模型,例如:Request。

  3. 来自 Josh Lewis:确保您的应用程序(或 Gem 列表)中没有重复的类或模块名称。

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

这是一个棘手的问题。

通常对我有用的是在生产服务器上运行“脚本/控制台生产”,然后输入:

Announcement

这通常会给你一个更好的错误信息。但是你说你已经尝试过了?

【讨论】:

  • 好的开始,值得一票。但是如何调试错误仅通过 Mongrel 发生的情况?
  • 我没有使用插件,并且在开发模式下出现此错误。
  • 投赞成票是不够的,你刚刚救了我!谢谢!
【解决方案2】:

我也遇到了这个错误。

简而言之,我的 lib 文件夹中的 rb 文件不在与我的模块命名约定匹配的文件夹结构中。这导致 ActiveSupport 自动加载器使用错误的模块来查看是否定义了我的类常量。

具体来说,我定义了以下类

module Foo
  class Bar
  end
end

在 /lib/bar.rb 的根目录中

这导致自动加载器询问模块 Object 是否定义了 Bar 而不是模块 Foo。

将我的 rb 文件移动到 /lib/foo/bar.rb 解决了这个问题。

【讨论】:

    【解决方案3】:

    我以前遇到过这种情况,应该归咎于 AttachmentFu 插件。我相信在我的情况下,这是由于AttachmentFu 期望的图像处理器与可用的图像处理器不同,或者还安装了不受支持的版本。当我将:with =&gt; :rmagick(或类似的——我正在使用RMagick)显式添加到has_attachment 方法调用中时,问题就解决了即使对于非图像附件也是如此。显然,请确保您的生产环境已安装所有正确的 gem(或将它们冻结到您的应用程序中)和支持软件 (ImageMagick)。 YMMV。

    至于没有让 Rails 和 AttachmentFu 吸收并隐藏真正的错误——我们在完全弄清楚之前修复了它。

    【讨论】:

    • 很好的额外信息,但不是一个完整的答案...我相信使用 joevandyk 的控制台测试技术会给你一个更好的错误消息。
    【解决方案4】:

    由于这仍然是 Google 的最高搜索结果,我想我应该分享一下解决问题的方法:

    我在 lib 文件夹中有一个与我的应用程序同名的模块。所以,我的模块名称有冲突,但我也有文件夹名称的冲突(不确定后者是否真的有影响)。

    因此,对于 OP,请确保您的应用程序(或 Gem 列表)中没有重复的类或模块名称。

    【讨论】:

      【解决方案5】:

      对我来说,原因是我的类定义中存在循环依赖,而问题只是在 Rails 中使用自动测试时才出现。就我而言,我不需要循环依赖,所以我只是将其删除。

      【讨论】:

        【解决方案6】:

        您可以尝试禁用所有插件,然后将它们一一添加。

        在 Initalizer 部分的environment.rb 中,添加如下一行:

        config.plugins = [ :exception_notification, :ssl_requirement, :all ]
        

        从运行您的应用程序的最低设置开始,然后将它们一一添加。当我定义一个碰巧映射到现有文件名的模型时,我通常会收到此错误。例如,一个 Request 模型,但 Rails 已经有一个 request.rb 被首先加载。

        【讨论】:

          【解决方案7】:

          我有一段时间遇到这个问题,在我的情况下,这个错误总是出现在这个 S3 错误之前:

          (AWS::S3::操作中止)“A 冲突的条件操作是 目前正在对此进行处理 资源。请再试一次。”

          这个问题通常在反复创建同一个存储桶时出现。 (来源AWS Developers forum)

          这是因为我使用 attachment_fu to 创建了存储桶,并且我在 lib/technoweenie/attachment_fu/backends/s3_backends.rb 中取消了包含命令 Bucket.create(@@bucket_name) 的行(靠近第 152 行)。

          一旦评论或删除命令Bucket.create(@@bucket_name)问题就消失了。

          我希望这会有所帮助。

          【讨论】:

            【解决方案8】:

            在使用 STI 时更改类名对我造成了这种影响:

            • 类从“EDBeneficiary”更改为“EdBeneficiary”
            • 现有记录的“类型”列中存储了“EDBeneficiary”,因此当 Rails 尝试加载它们时,会引发异常。

            修复:运行迁移以更新“类型”列中的值以匹配新类名。

            【讨论】:

              【解决方案9】:

              在我的情况下,我在开发控制台中收到此错误,但我可以在 irb 中加载该类

              【讨论】:

                【解决方案10】:

                抱歉,这不是一个确定的答案,而是另一种可能在某些特定情况下有效的方法:

                我刚刚在使用 Ruby 1.8.7 和 Merb 1.0.15 调试站点时遇到了这个问题。似乎有问题的类(我们称之为 SomeClass)超出了范围,但是当 some_class.rb 文件被自动加载时,它需要的其他文件(some_class/base.rb 等)没有被 require 机制加载。可能是 require 中的错误?

                如果我之前需要 some_class 文件,例如 environment.rb 的结尾,它似乎可以防止对象超出范围。

                【讨论】:

                  【解决方案11】:

                  我收到此错误是因为控制器定义位于未命名为控制器的文件中。例如,您有一个 Comment 模型,并在 comment.rb 文件而不是 cmets_controller.rb 中定义控制器

                  【讨论】:

                    【解决方案12】:

                    我在使用 rails 1.2.3 版时遇到了这个问题。我只能用 mongrel 重现这个问题,使用控制台环境访问没有提供任何有用的信息。就我而言,我解决了使 RAILS_ROOT/html 文件夹可由 mongrel 写入然后重新启动 Web 服务器的问题,正如一些用户在此处报告的那样:

                    http://www.ruby-forum.com/topic/77708

                    【讨论】:

                      【解决方案13】:

                      当我将应用程序的 rails 从 1.1.6 升级到 1.2.6 和 2.0.5 时,我遇到了这个错误。简而言之,旧插件导致了这个错误。这些插件已经过时并且不再更新(甚至没有回购!)。删除它们后,该应用程序在 1.2.6 和 2.0.5 上运行。但是我没有查看插件的详细源代码。

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2019-10-24
                        • 2022-07-22
                        • 2019-02-13
                        • 1970-01-01
                        • 2022-01-07
                        • 2018-03-20
                        • 1970-01-01
                        相关资源
                        最近更新 更多