使用 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")
我正在使用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")