ruby-on-rails - 子文件夹中的子类模型不会自动加载

标签 ruby-on-rails ruby ruby-on-rails-3

我的一些模型有两级继承:(这都在 /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/

相关文章:

ruby - 未定义的方法 ... 对于类 (NoMethodError)

ruby-on-rails - 如何将模型导入自定义 rake 任务?

ruby-on-rails - ActionView::MissingTemplate,带有 JSON 的 Rails 5 API

database - Postgres - 尝试 rake db :create:all 后无法连接到服务器

Javascript 不适用于 FireFox for Android,仅适用于我的网站

css - Ruby On Rails form_for 复选框太小

ruby-on-rails - CanCan授权问题索引 Action

ruby-on-rails - 如何从heroku备份sqlite3

ruby-on-rails - 在Rails中,在操作方法中使用局部变量或实例变量是否重要

ruby-on-rails - Rails 应用程序中的 AssociationTypeMismatch(预期对象,获得 HashWithIn DifferentAccess)