2016-03-30 15 views
0

Ich habe viele Controller, die identisch benannt sind in different namespaces:Rake Environment Superklasse Mismatch dann einschließlich lib Ordner?

Marketplace::ProductsController < ApplicationController 

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

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

, die mit rails s und rails c, beide Unit-Tests und Gurken Tests fein arbeiten.

Als ich jedoch getting started with ActiveJob tutorial folgte und versuchte, den Befehl QUEUE=* rake environment resque:work auszuführen, wird der folgende Fehler ausgegeben.

TypeError: superclass mismatch for class ProductsController 

Es scheint, als ob resque nicht glücklich über diese beiden identisch benannten Controller ist - Namespace sie auch sein mögen - aus verschiedenen Klassen erben. Gibt es irgendeinen Grund, warum rake environment sich über jede andere Rake-Aufgabe beschwert und Rails damit in Ordnung ist.

Update 1:

ich gefunden habe, dass für API::V2::Marketplace::ProductsController wie unten definiert ist:

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

Sobald ich es unten verändert, scheint der Fehler behoben worden zu sein.

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

Inzwischen Marketplace::ShopsController und API::V2::Marketplace::ShopsController hat kein Problem, auch wenn diese, wie unten

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

Der Fehler ist nun über einige rspec Dateien in meinem lib Ordner definiert wurde. Ich habe einige Lib-Ordner hinzugefügt, die etwas mit der Codebasis verwandt, aber nicht wirklich verwendet werden. Anscheinend versucht es, diese Dateien zu laden und mir einen solchen Fehler zu geben, als der QUEUE=* rake environment resque:work Befehl ausgegeben wurde.

Sobald ich diese Legacy-Dateien aus den Ordnern lib entfernt habe, bekomme ich keinen Fehler.

Enthält rake environment alles von lib? Ich finde das ungläubig, da alle anderen Rake-Aufgaben, die ich ausgeführt habe, nichts dergleichen tun.

Update 2:

Während genaueres Hinsehen mit --trace. Ich könnte meine puts Nachricht so sehen.

** 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 scheint wie der Täter. Kann ich das irgendwie gierig ausschließen?

Antwort

0

Während diese zwei identisch erscheinen könnte den tatsächlichen Nachschlag von BaseController ist ganz anders:

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 

Im ersten Beispiel BaseController wird aus dem „globalen“ Namensraum (das main Objekt) gelöst werden. Während in der Sekunde wird es von der gegenwärtigen Verschachtelung aufgelöst.

Wenn Sie also eine Klasse wie im ersten Beispiel definieren, sollten Sie explizit den vollständigen Pfad zur Oberklasse angeben.

Der Fehler mit den falsch platzierten RSpec-Spezifikationen ist wahrscheinlich, dass sie auf das Verhalten älterer Versionen von RSpec angewiesen waren, wo sie ihre DSL im Hauptobjekt platziert haben oder dass der RSpec-Edelstein in der aktuellen Umgebung nicht einmal geladen wurde.

Schienen erfordert standardmäßig nicht jede Datei in lib - stattdessen vermute ich, der Täter ist ein fehlerhafter Versuch, die Dateien automatisch zu laden.

+0

Ich habe ein weiteres Update hinzugefügt, das "resque: preload" als Schuldigen gefunden hat. Irgendeine Möglichkeit, es davon abzuhalten, gierig alles zu laden? – mmhan