使用 Rails autoload_path,无法自动加载常量预期不正确的子文件夹

Using Rails autoload_path, Unable to autoload constant expected incorrect subfolder

我正在使用Monologue Gem and DeviseGem。

我正在使用配置 autoload_paths 加载我的子目录,其中包括一些演示模型。

Rails 4: organize rails models in sub path without namespacing models?

app/config/application.rb

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{*/}')]

我认为我的问题源于我需要覆盖 Monologue User 模型。为此,我创建了一个本地文件

app/models/monologue/user.rb

class Monologue::User < ActiveRecord::Base
    # code
end

我在

也有我的应用程序的用户模型

app/models/user.rb

class User < ActiveRecord::Base
    # code
end

我收到的错误是

ruby-2.1.5/gems/activesupport-4.1.1/lib/active_support/dependencies.rb:481:in `load_missing_constant': Unable to autoload constant User, expected /Users/Shared/code/kindrdfood/RecRm/app/models/monologue/user.rb to define it (LoadError)

您已将 classes 命名空间的一部分包含到自动加载路径 (app/models/monologue) 中。

保持自动加载路径不变。路径 app/models 已包含在内。 Rails 尝试为给定的 class 名称查找合适的文件,如果它不存在的话。如果不修改加载路径,User 应该自动加载 app/models/user.rb 并且 Monologue::User 应该自动加载 app/models/monologue/user.rb.

Rails 实际做的是在您的 class(分别是其字符串表示)上调用 underscore 方法。所以在 Rails 控制台上,你可以这样做:

>> "Monologue::User".underscore
=> "monologue/user"

>> "User".underscore
=> "user"

编辑:

如果您想将自定义加载路径添加到 rails' 自动加载功能,我建议不要将它们放在列表中已包含的文件夹中。也许是这样的:

config.autoload_paths << File.join(config.root, "app/decorators")
config.autoload_paths << File.join(config.root, "app/workers")
config.autoload_paths << File.join(config.root, "lib")