Rails3:警告:toplevel引用的常量ApplicationController

时间:2010-07-04 17:41:48

标签: ruby-on-rails inheritance ruby-on-rails-3

每次我收到警告:

app/controllers/agency/agencies_controller.rb:1: warning: toplevel constant ApplicationController referenced by Agency::ApplicationController

我的agencies_controller.rb:

class Agency::AgenciesController < Agency::ApplicationController

  def index
    ...
  end 

  ...
end

和Agency :: ApplicationController:

class Agency::ApplicationController < ApplicationController
  layout 'agency'

  helper_method :current_agency
  private

  def current_agency
    @current_agency ||= current_user.agency 
  end

end

铁轨对我有什么要求?有什么麻烦?

与另一个控制器相同的情况

class Agency::ClientsController < Agency::ApplicationController
  ...
end

没有警告,没有错误......

6 个答案:

答案 0 :(得分:12)

我意识到这个问题已经差不多两年了,但我最近通过another stackoverflow帖子偶然发现了这个问题,并希望分享一些见解。

基本上,如果您的命名空间Agency恰好是class而不是module,那么您将收到该警告。在我上面粘贴的stackoverflow帖子中,他们有class的模型(Admin),其名称空间也是Admin

This可以更好地解释正在发生的事情。

因此,请检查您的代码是否未在某处定义Agency类。祝你好运。

答案 1 :(得分:7)

我在Spork命名空间控制器中运行WatchrAdmin时出现类似问题。所以我通过在each_run中的spec_helper.rb块中添加以下代码来解决这个问题:

Dir[File.expand_path("app/controllers/admin/*.rb")].each do |file|
    require file
end 

所有积分都转到guy from this thread

答案 2 :(得分:5)

ApplicationController是Rails在您创建所有其他控制器类继承的新项目时为您生成的超类控制器的名称。某处可能存在冲突,因为您使用了相同的名称,即使您将其放在命名空间内也是如此。

尝试为Agency::ApplicationController提供不同的名称。

答案 3 :(得分:2)

设置SporkWatchr后,我遇到了类似的问题。在此过程中,我关闭了类缓存(config_cache_classes => false中的config/environments/test.rb),以便在spork环境中根据需要重新加载更改。转动类缓存back on会使警告消失。

答案 4 :(得分:2)

就我而言,这是Devise的问题。我有一个设计模型Admin和命名空间路由Admin。将命名空间路由更改为Admins解决了问题。

答案 5 :(得分:0)

我的解决方案是添加以下行:

# spec/rails_helper.rb
Dir[File.expand_path("app/controllers/admin/*.rb")].each { |file| require file }