我有许多在different namespaces中具有相同名称的控制器:
Marketplace::ProductsController < ApplicationController
Office::Marketplace::ProductsController < Office::BaseController
API::V2::Marketplace::ProductsController < BaseController
与rails s
和rails 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::ShopsController
和API::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
似乎是罪魁祸首。无论如何我可以贪婪地解决这个问题吗?
答案 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
中的每个文件 - 而是我怀疑罪魁祸首是自动加载文件的错误尝试。