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?
konnte nicht reproduzieren. – Ilya
@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
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