【发布时间】:2014-06-25 05:38:48
【问题描述】:
我的一些模型有两个级别的继承:(这些都在 /app/models 中)
A.rb
/A/B1.rb
/A/B1/C1.rb
/A/B1/C2.rb
/A/B1/C3.rb
/A/B2.rb
/A/B2/C1.rb
/A/B2/C2.rb
/A/B2/C3.rb
...
A.rb 很简单:
class A
def self.inherited(subclass)
puts "New subclass: #{subclass}"
end
# some methods
end
B1.rb 是:
class A::B1 < A
# some methods
end
C1.rb 是:
class A::B1::C1 < A::B1
# some methods
end
您可以插入其余模型的外观。
当我加载 rails console 时,我看到了这个:
New subclass: A::B1
New subclass: A::B1::C1
New subclass: A::B2
请注意,A::B1::C2、A::B1::C3 和 A::B2 的子类都没有继承!这是为什么呢?
它变得更奇怪了。在rails console,我可以这样做:
irb(main)> A::B1::C2
New subclass: A::B1::C2
A::B1::C2 < A::B1
irb(main)> A::B2::C1
New subclass: A::B2::C1
A::B2::C1 < A::B2
所以我可以键入所有未继承的子类,然后它突然触发puts 消息。我认为这证明问题出在自动加载器上,而不是我的代码上。
这发生在我使用 Ruby 1.9 的开发环境中。和 Rails 3.2。
这是我的config.autoload_paths 声明:
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
提前致谢!
【问题讨论】:
-
您的自动加载配置位于
config/application.rb中,可能如下所示:config.autoload_paths += %W(#{config.root}/lib...是覆盖自动加载路径还是附加到它们?您应该使用rails console加载Rails 上下文。 Rails 是application.rb。irb仅适用于普通 Ruby。 -
嘿@Chloe - 这就是我所拥有的:
config.autoload_paths += %W(#{config.root}/lib)和config.autoload_paths += Dir["#{config.root}/lib/**/"] -
你说得对——我一直在使用
rails c。我会更新我的问题。谢谢! -
也可以试试
class.parent和class.superclass看看它会打印什么。A::B1::C1.parent和A::B1::C1.superclass. -
A::B1::C1.parent和A::B1::C1.superclass都返回A::B1 < A。未自动加载的类返回相同的内容。
标签: ruby-on-rails ruby ruby-on-rails-3