2017-01-26 22 views
5

的情況下在一個Rails應用程序,我的工作,我有這樣的代碼如下:Rails的:子類沒有註冊爲父類

# 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 

當我運行這個本地性能達到要求,我也得到「不無「作爲返回值。但我在我的測試環境中得到了nil

測試環境表明A是祖先的letterB.new)(B.ancestors)之間,但未按與殼體相等運算或is_a?(A)子類來註冊。

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

這似乎是一個Rails自動加載的問題,但我不知道爲什麼,如果父類被包含在這兩個環境中的祖先,這些方法將失敗。這是怎麼回事?

+0

無法重現。 – Ilya

+0

@Ilya我很確定這是由應用程序中的所有其他類引起的自動加載問題。在這裏重現太大,太私密,無法鏈接到回購。 – steel

+0

這很可能是'spring'的問題。你在使用'spring'嗎?如果是這樣,請先嚐試殺死'spring',然後再次嘗試你的測試。正如你所說,'case/when'應該使用'is_a?'調用,'B.new.is_a(A)'將返回'true' – etagwerker

回答

0

同意,這看起來像一個自動加載問題。雖然不理想,但您可以通過在B中添加require_dependency調用來解決此問題。

至於在哪裏尋找根問題,您可能在測試環境中存在某些庫中的依賴項,這些庫依賴項在Test上不存在。我會在測試中加載REPL並檢查A。一些有用的方法:

​​

相關問題