Rails3: предупреждение: константа верхнего уровня ApplicationController, на которую ссылается

Каждый раз, когда я получаю предупреждение:

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

Мои агентства_controller.rb:

class Agency::AgenciesController < Agency::ApplicationController

  def index
    ...
  end 

  ...
end

И Агентство:: 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

И никаких предупреждений, никаких ошибок...


person petRUShka    schedule 04.07.2010    source источник


Ответы (6)


Я понимаю, что этому вопросу почти два года, но недавно я наткнулся на него через -global-controllers-with-s/10902980#10902980">другой пост о стеке и хотел бы поделиться некоторыми соображениями.

По сути, если ваше пространство имен Agency окажется class вместо module, вы получите это предупреждение. В сообщении stackoverflow, которое я вставил выше, у них была модель (class) из Admin, и их пространство имен также было Admin.

Это дает лучшее объяснение того, что происходит.

Поэтому проверьте, не определяет ли ваш код где-нибудь класс Agency. Удачи.

person Bart Jedrocha    schedule 05.06.2012

У меня были похожие проблемы с запуском Spork и Watchr в моих контроллерах с пространством имен Admin. Поэтому я исправил это, добавив следующий код в блок each_run в spec_helper.rb:

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

Все кредиты принадлежат парню из этой темы

person Vadim Chumel    schedule 28.09.2011
comment
Спасибо, это сработало отлично, но я немного изменил его для краткости: Dir[Rails.root.join(app/controllers/admin/*.rb)].each {|f| требуется f} - person Matt Smith; 02.02.2012
comment
после нескольких часов ударов головой .. это решило мою проблему .. хорошо, что я заметил это предупреждение и хорошо, что нашел этот ответ .. большое спасибо. - person whizcreed; 18.07.2012

ApplicationController — это имя контроллера суперкласса, который Rails генерирует для вас, когда вы создаете новый проект, от которого наследуются все остальные классы вашего контроллера. Вероятно, где-то возник конфликт, потому что вы использовали одно и то же имя, даже если поместили его в пространство имен.

Попробуйте дать вашему Agency::ApplicationController другое имя.

person John Topley    schedule 04.07.2010
comment
Но почему нет проблем с Agency::ClientsController?? - person petRUShka; 07.07.2010
comment
Потому что ClientsController не имеет особого значения для Rails. - person John Topley; 07.07.2010
comment
У меня есть работающий Admin::ApplicationController, который не вызывает проблем. Поэтому переименование не требуется. Вероятно, где-то в стеке вызовов присутствует двусмысленность, на которую жалуется Ruby. - person Joost Baaij; 04.01.2012

У меня были похожие проблемы после настройки Spork и Watchr. В процессе я отключил кеширование классов (config_cache_classes => false в config/environments/test.rb), чтобы изменения перезагружались по мере необходимости в среде spork. Включение кэширования классов back on привело к исчезновению предупреждений.

person Yardboy    schedule 01.09.2011

В моем случае это была проблема с Devise. У меня был администратор модели разработки и администратор маршрутов с именами. Изменение маршрута пространства имен к администраторам решило проблему.

person tundrax    schedule 09.08.2012

Решением для меня было добавить эту строку:

# spec/rails_helper.rb
Dir[File.expand_path("app/controllers/admin/*.rb")].each { |file| require file }
person Štefan Bartoš    schedule 11.03.2015