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

时间:2016-04-14 18:02:30

标签: ruby-on-rails ruby ruby-on-rails-4 devise monologue

我正在使用Monologue宝石和Devise宝石。

我使用config autoload_paths来加载包含一些演示模型的子目录。

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

应用/配置/ application.rb中

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

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

应用/模型/独白/ user.rb

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

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

应用/模型/ user.rb

class User < ActiveRecord::Base
    # code
end

我收到的错误是

  

ruby​​-2.1.5 / gems / activesupport-4.1.1 / lib / active_support / dependencies.rb:481:在`load_missing_constant&#39;:无法自动加载常量用户,预计   /Users/Shared/code/kindrdfood/RecRm/app/models/monologue/user.rb to   定义它(LoadError)

1 个答案:

答案 0 :(得分:1)

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

保持自动加载路径不变。路径app/models已包含在内。如果某个类名尚不存在,Rails会尝试查找要包含的适当文件。如果不修改加载路径,User应自动加载app/models/user.rb,而Monologue::User应自动加载app/models/monologue/user.rb

Rails实际上做的是在你的类上调用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")