Rails加载顺序更改类定义

时间:2015-07-02 16:24:00

标签: ruby-on-rails ruby

我有一个非常奇怪的错误,我从未遇到过,无法找到答案。我有一个类定义,如下所示:

# 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

我真的很难过这个。

1 个答案:

答案 0 :(得分: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.rb中定义了other.rb/models及其各自的空类。在任一序列中对两个类调用cache_key_template现在按预期工作。

您对base.rbother.rb的实施情况如何?