Rake Environment Superclass Mismatch然后包括lib文件夹?

时间:2016-03-30 09:15:25

标签: ruby-on-rails ruby rake resque

我有许多在different namespaces中具有相同名称的控制器:

Marketplace::ProductsController < ApplicationController

Office::Marketplace::ProductsController < Office::BaseController

API::V2::Marketplace::ProductsController < BaseController

rails srails c一起正常工作,包括单元测试和黄瓜测试。

但是,当我按下getting started with ActiveJob tutorial并尝试运行命令QUEUE=* rake environment resque:work时,会产生以下错误。

TypeError: superclass mismatch for class ProductsController

似乎resque对这两个名称相同的控制器感到高兴 - 它们可能是命名空间 - 从不同的类继承。是否有任何理由rake environment抱怨所有其他rake任务,并且rails可以使用它。

更新1:

我发现API::V2::Marketplace::ProductsController定义如下:

module API
  module V2
    class Marketplace::ProductsController < BaseController
    end
  end
end

一旦我将其更改为下面,错误似乎已经解决了。

class API::V2::Marketplace::ProductsController < API::V2:BaseController
end

同时Marketplace::ShopsControllerAPI::V2::Marketplace::ShopsController没问题,即使后者定义如下

module API
  module V2
    class Marketplace::ShopsController < BaseController
  end
end

现在我的lib文件夹中的某些rspec文件出现错误。我添加了一些与代码库略有相关的lib文件夹,但没有真正使用过。显然,它正在尝试加载这些文件,并在发出QUEUE=* rake environment resque:work命令时给出错误。

NoMethodError: undefined method `describe' for main:Object

一旦我从lib文件夹中删除了这些遗留文件,我就没有错误。

rake environment是否包含lib中的所有内容?我发现这个不可思议,因为我一直在运行的所有其他rake任务都没有这样做。

更新2:

--trace进行更密切的检查。我可以看到这样的puts消息。

** Invoke environment (first_time)
** Execute environment
** Invoke resque:work (first_time)
** Invoke resque:preload (first_time)
** Invoke resque:setup (first_time)
** Execute resque:setup
** Execute resque:preload
** My puts message.**
** Invoke resque:setup
** Execute resque:work

resque:preload似乎是罪魁祸首。无论如何我可以贪婪地解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

虽然这两个看起来可能相同但BaseController的实际查找却完全不同:

class API::V2::Marketplace::ProductsController < BaseController; end

module API
  module V2
    module Marketplace
      # will use this class as super
      class BaseController; end

      class ProductsController < BaseController; end
    end
  end
end

在第一个示例中,BaseController将从“全局”命名空间(main对象)解析。在第二个中,它将从当前嵌套中解析。

因此,如果你在第一个例子中定义一个类,你应该明确说明超类的完整路径。

错失RSpec规范的错误可能是它们依赖于旧版RSpec的行为,它将DSL放在主对象中,或者RSpec gem甚至可能无法在当前环境中加载。< / p>

默认情况下,Rails不需要lib中的每个文件 - 而是我怀疑罪魁祸首是自动加载文件的错误尝试。