Ruby on rails 如何修复/调试&x27;期望x.rb定义x.rb';在轨

Ruby on rails 如何修复/调试&x27;期望x.rb定义x.rb';在轨,ruby-on-rails,ruby,Ruby On Rails,Ruby,我已经看到这个问题在许多不同的情况下出现,并且希望获得在StackOverflow上修复/调试它的最佳实践 用一个现实世界的例子来说,我今天早上发生了这样一件事: expected announcement.rb to define Announcement 该类在开发、测试和生产控制台中运行良好,但在生产混血儿中失败。下面是课程: class Announcement < ActiveRecord::Base has_attachment :content_type => '

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

用一个现实世界的例子来说,我今天早上发生了这样一件事:

expected announcement.rb to define Announcement
该类在开发、测试和生产控制台中运行良好,但在生产混血儿中失败。下面是课程:

class Announcement < ActiveRecord::Base
  has_attachment :content_type => 'audio/mp3', :storage => :s3
end
课程公告'audio/mp3',:存储=>:s3
结束
我想在回答中解决的问题与其说是解决这个具体问题,不如说是如何正确地调试Rails,让它像预期的那样给您一个有意义的错误x.rb来定义x.rb’通常是一个麻烦

编辑(到目前为止有3个很好的回复,每个回复都带有部分解决方案

调试:

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

  • 从Otto开始:尝试通过初始值设定项设置最小插件集,例如:config.plugins=[:exception\u notification,:ssl\u requirement,:all],然后一次重新启用一个

  • 具体原因:

  • 来自Ian Terrell:如果您正在使用附件,请确保安装了正确的图像处理器。即使您没有附加图像,附件也需要它

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

  • 来自Josh Lewis:确保应用程序(或Gem列表)中的某个地方没有重复的类或模块名称


  • 这是一个棘手的问题

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

    公告


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

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


    至于不让Rails和AttachmentFu吸收并隐藏真正的错误——我们在完全弄清楚之前就解决了它。

    您可以尝试禁用所有插件,然后逐个添加它们

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

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

    从运行应用程序的最小设置开始,逐个添加它们。当我定义了一个恰好映射到现有文件名的模型时,通常会出现此错误。例如,一个请求模型,但Rails已经有一个首先加载的Request.rb。

    我有一段时间遇到此问题,在我的情况下,总是会出现此错误从该S3错误中删除:

    (AWS::S3::操作中止)“A 存在冲突的条件操作 目前正在针对这一问题进行调查 资源。请重试。“

    这个问题通常发生在反复创建同一个bucket时。(来源)

    这是因为我使用了
    attachment\u fu来创建bucket,并且在
    lib/technoweenie/attachment\u fu/backends/s3\u backends.rb中取消了包含命令
    bucket.create(@@bucket\u name)
    的行(靠近第152行)

    一旦注释或删除了命令
    Bucket.create(@@Bucket\u name)
    问题就消失了


    我希望这会有所帮助。

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

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

    我在使用Ruby 1.8.7和Merb 1.0.15调试一个站点时遇到了这个问题。这个类(我们称它为SomeClass)似乎不在范围之内,但是当某个_class.rb文件被自动加载时,它需要的其他文件(某些_class/base.rb等)就被删除了未由require机制加载。require中可能存在错误


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

    由于控制器定义位于一个未命名为控制器的文件中,所以出现了此错误。例如,您有一个注释模型,并且您在Comment.rb文件中定义了控制器,而不是comments_controller.rb

    既然这仍然是谷歌的头条搜索结果,我想我应该分享一下解决问题的方法:

    我在lib文件夹中有一个与我的应用程序名称完全相同的模块。因此,我在模块名称上有冲突,但在文件夹名称上也有冲突(但不确定后者是否真的起作用)


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

    使用STI时更改类名会导致以下情况:

    • 类别从“Ed受益人”更改为“Ed受益人”
    • 现有记录的“ed受益人”存储在“类型”列中,因此当Rails尝试加载它们时,会引发异常

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

    我在rails版本1.2.3中遇到了这个问题。我只能在mongrel中重现这个问题,使用console environment access没有提供任何有用的信息。在我的例子中,我解决了使rails\u ROOT/html折叠的问题
    module Foo
      class Bar
      end
    end