我的一些模型有两级继承:(这都在 /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.autoload_paths
选项中包含各种模型:
#config/application.rb
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
这利用了 globbing - 基本上将特定目录中的任何文件添加到您的路径中。我们将上面的代码用于单级目录(app/models/directory/1.rb
);如果您想使用多个级别,则必须像这样指出它们:
Dir[Rails.root.join('app', 'models', '{*}', '{**}')]
关于ruby-on-rails - 子文件夹中的子类模型不会自动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24400960/