2017-01-26 28 views
5

In einer Rails-app, die ich in arbeite, habe ich Code wie folgt aus:Rails: Subclass nicht als Instanz der übergeordneten Klasse Registrierung

# app/models/a.rb 
class A < ActiveRecord::Base; ...; end 
# app/models/b.rb 
class B < A; ...; end 

# /app/elsewhere... 

do_case(B.new) 

def do_case(letter) 
    case letter 
    when A 
    "not nil" 
    end 
end 

Wenn ich laufen diese lokal führt es wie erwartet und ich „nicht nil "als Rückgabewert. Aber ich bekomme nil in meiner Testumgebung.

Die Testumgebung zeigt, dass A unter den Vorfahren (B.ancestors) von letter (B.new), aber nicht mit dem Fall Gleichheitsoperator oder is_a?(A) als eine Unterklasse registrieren. Diese

A === B.new #=> false in test environment, true locally 
B.new.is_a?(A) #=> false in test environment, true locally 

scheinen wie ein Rails autoloading Problem, aber ich bin mir nicht sicher, warum diese Methoden versagt würden, wenn die Elternklasse in den Vorfahren in beiden Umgebungen enthalten ist. Was ist los?

+0

konnte nicht reproduzieren. – Ilya

+0

@Ilya Ich bin mir ziemlich sicher, dass es sich um ein Problem beim automatischen Laden handelt, das von vielen anderen Klassen in der Anwendung verursacht wird. Zu groß, um sich hier zu reproduzieren, zu privat, um mit dem Repo zu verlinken. – steel

+0

Dies ist wahrscheinlich ein Problem mit "Frühling". Verwenden Sie 'Frühling'? Wenn dies der Fall ist, versuchen Sie zunächst, Spring zu töten, und versuchen Sie es dann erneut. Wie du schon sagtest, sollte 'case/when' die' is_a? 'Aufrufe verwenden und' B.new.is_a? (A) 'wird' true' zurückgeben – etagwerker

Antwort

0

Stimmen Sie zu, dies sieht wie ein Autoloading-Problem aus. Obwohl nicht ideal, können Sie es lösen, indem Sie einen require_dependency Anruf in B hinzufügen.

Soweit es nach dem Root-Problem suchen, ist es möglich, dass Sie einige Bibliothek Abhängigkeiten in Ihrer Testumgebung haben, die nicht in Test vorhanden sind. Ich würde eine REPL auf Test laden und A überprüfen. Einige nützliche Methoden:

class A 
    def self.what_is_my_nesting 
    Module.nesting 
    end 
end 

A.what_is_my_nesting 
A.ancestors 
B.ancestors 

etc

Verwandte Themen