2017-01-20 1 views
2

Ich arbeite in jemand anderen Code und ich habe einen HTTParty-Dienst in einer Rails-App mit der folgenden Klassenhierarchie. Beachten Sie die Unterklasse #initialize mit einer anderen Signatur als die Elternklasse.Ruby: undefined Methode für nicht initialisiert

module A 
    class Base 
    include HTTParty 
    ... 
    end 
end 

module A 
    class User < Base 

    def initialize(user) 
     @user = user 
    end 
    end 
end 

module A 
    class PublicUser < User 

    def initialize(opts = {}) 
     @limit = opts[:limit] 
     # no call to super 
    end 
    end 
end 

Vor Ort gibt es keine Probleme mit diesem, aber in SemaphoreCI die folgenden Ergebnisse:

A::PublicUser.new(limit: 1).some_method 
undefined method `some_method' for #<A::PublicUser not initialized> 

ich keine Dokumentation über die „nicht initialisiert“ -Meldung finden. Was verursacht diese Art von Versagen?

+0

Ist das ein einfacher Rubin oder Schienen? – mudasobwa

+0

Die Klassen, die den Fehler verursachen, sind alle einfach Rubin. Aber es wird in einer Rails-Anwendung aufgerufen. – steel

+0

Haben Sie explizit alle Dateien benötigt? – mudasobwa

Antwort

2

OK, ich habe es. Ich habe auch deine Frage mit markiert, da einfacher guter Rubin selten solch ein merkwürdiges Verhalten geben würde.

Sie haben zwei verschiedene, mehr oder weniger unzusammenhängende Probleme erlebt.

  1. #<A::PublicUser not initialized> ist ein Ergebnis der (sic!) Ruft inspect auf A::PublicUser. So versucht Ruby eine Fehlermeldung zu formatieren und - voilà - die Klasse wird so ausgedruckt.

  2. Schienen verwirren mit Ihnen, sowie mit der ständigen Suche. A::Base Name Konflikte mit ActiveRecord::Base, und raten Sie, was gelöst wird, wenn class User < Base erfüllt ist. Um dieses Verhalten zu replizieren, öffnen Sie möglicherweise eine Konsole und führen Folgendes aus: class Q < ActiveRecord::Base; end; Q.allocate, was zu #<Q not initialized> führt. (Liebst du Rails schon wie ich?)

  3. Um dies zu beheben, entweder explizit class User < A::Base angeben oder Base-MyBase umbenennen. Tut mir leid, dass ich das vorgeschlagen habe.

+0

Okay, das sagt mir, was mit meinem Code passiert, aber ich verstehe immer noch nicht, was allgemein passiert. Vielleicht ist Ihr erster Punkt, dass Sie das abdecken. Ist der Aufruf von '.new' fehlgeschlagen und wurde' inspect' aufgerufen ... was? – steel

+0

Ich glaube, der Aufruf von 'new' ist nicht fehlgeschlagen, sondern es wurde eine Unterklasse der' ActiveRecord :: Base' Klasse erstellt, der wiederum die Methode 'some_method' fehlt. – mudasobwa

+0

Hm. Und "nicht initialisiert" ist ein ActiveRecord-Fehler, den Sie erhalten, wenn Sie eine Methode aufrufen, die kein Schlüssel im Initialisierungsobjekt war? (oder etwas) – steel

Verwandte Themen