2015-07-02 73 views
4

我有一個非常奇怪的錯誤,我從來沒有遇到過,無法找到任何地方的答案。我有一個類定義,看起來像這樣:Rails加載順序更改類定義

# app/models/base/cache_key.rb 
class Base 
    class CacheKey 
    class_attribute :cache_key_template, :instance_writer => false 
    self.cache_key_template = "base:tracker-%s-%s" 
    end 
end 

# app/models/other/cache_key.rb 
class Other 
    class CacheKey < ::Base::CacheKey 
    self.cache_key_template = "other:tracker-%s-%s" 
    end 
end 

然而,當我跳進一個控制檯會話,它做了一些時髦的煩躁

$ rails console 
> Base::CacheKey.cache_key_template 
=> "base:tracker-%s-%s" 
> Other::CacheKey.cache_key_template 
=> "base:tracker-%s-%s" 
> Other::CacheKey 
=> Base::CacheKey 

嗯,怪異。反過來呢?

$ rails console 
> Other::CacheKey.cache_key_template 
=> "other:tracker-%s-%s" 
> Base::CacheKey.cache_key_template 
=> "base:tracker-%s-%s" 
> Other::CacheKey 
=> Other::CacheKey 

我真的很難過這個。

+0

這些類定義的路徑是什麼?這可能會對Rails的自動加載行爲產生影響。例如。他們在'app/models/base/cache_key.rb'和'app/models/other/cache_key.rb'還是別的?還有哪個版本的Rails? –

+0

對於自動加載程序正確處理這些每個都應該在自己的文件中定義。在其他文件中定義'Other'會導致混淆,它應該在'other.rb'中。 – tadman

+0

Rails的版本是4.0.5,它們是在等效的'app/models/base/cache_key.rb'和'app/models/other/cache_key.rb'中指定的。 –

回答

0

我複製了你的文件結構並得到了不同的結果,這很有趣。

pry(main)> Other::CacheKey.cache_key_template 
TypeError: Other is not a class 

pry(main)> Other::CacheKey 
TypeError: Other is not a class 
pry(main)> Other.class 
=> Module 
pry(main)> Base 
=> Base 
pry(main)> Base.class 
=> Module 

看起來Rails將名稱空間初始化爲模塊。你有BaseOther在其他地方定義爲類?

編輯: 我定義了base.rbother.rb/models與他們各自的空白類。在任何一個序列的兩個類中調用cache_key_template現在按預期工作。

你的執行base.rbother.rb是什麼樣的?