2016-03-30 4 views
0

У меня есть много контроллеров, которые одинаково названные в different namespaces:Неверное выравнивание суперкласса окружающей среды, включая папку lib?

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 

Кажется, как будто спасательный не устраивают об этих двух одинаково названных контроллерах - пространство имен они могут быть - унаследовав от различных классов. Есть ли причина, по которой rake environment жалуется на каждую другую задачу рейка, и рельсы в порядке с ней.

Update 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 

Ошибка теперь о некоторых Rspec файлов в моей lib папке. Я добавил некоторую папку lib, которая немного связана с базой кода, но не используется. По-видимому, он пытается загрузить эти файлы и дать мне такую ​​ошибку, когда вышла команда QUEUE=* rake environment resque:work.

NoMethodError: undefined method `describe' for main:Object 

Как только я удалил эти устаревшие файлы из папок lib, я не получаю ошибок.

Входит ли rake environment все из lib? Я нахожу это недоверием, так как все другие задачи грабли, которые я выполнял, ничего не делают.

Update 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

Хотя эти два может показаться идентичным фактический поиск по 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 не может быть загружен в текущую среду.

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

+0

Я добавил еще одно обновление, которое обнаружило 'resque: preload' как преступника. Любой способ остановить его от жадно загружать все? – mmhan