可能会有这样的事情吗?
app/models/
app/models/users/user.rb
app/models/users/education.rb
目标是更好地组织/ app / models文件夹,但不必为模型命名空间。
Rails 3的一个悬而未决的问题是: Rails 3.2.9和子文件夹中的模型。
使用命名空间指定table_name似乎可以工作(请参见Rails 4模型子文件夹),但是我想在没有命名空间的情况下执行此操作。
可能会有这样的事情吗?
app/models/
app/models/users/user.rb
app/models/users/education.rb
目标是更好地组织/ app / models文件夹,但不必为模型命名空间。
Rails 3的一个悬而未决的问题是: Rails 3.2.9和子文件夹中的模型。
使用命名空间指定table_name似乎可以工作(请参见Rails 4模型子文件夹),但是我想在没有命名空间的情况下执行此操作。
Answers:
默认情况下,Rails不会将models目录的子文件夹添加到自动加载路径。这就是为什么它只能找到命名空间模型的原因-命名空间照亮了要查找的子目录。
要将app / models的所有子文件夹添加到自动加载路径,请将以下内容添加到config / application.rb:
config.autoload_paths += Dir[Rails.root.join("app", "models", "{*/}")]
或者,如果您有一个更复杂的app / models目录,则上述将app / models的所有子文件夹组合在一起的方法可能无法正常工作。在这种情况下,可以通过更加明确的方式并仅添加指定的子文件夹来解决此问题:
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name1>")
config.autoload_paths += Rails.root.join("app", "models", "<my_subfolder_name2>")
从Rails 4.1开始,config.autoload_paths
默认情况下不包含应用生成器。因此,请注意,以上内容确实属于config / application.rb。
修复了以上代码中使用{*/}
代替的自动加载路径示例{**}
。请务必阅读muichkine的评论以获取详细信息。
app/models/user/credits.rb
确保文件中的类名也为复数:class Credits
。但是,我建议使用Rails标准并使其class Credit
与文件名相同app/models/user/credit.rb
(模型应为单数)。无论哪种方式,这都应该是问题所在。让我知道!
config.autoload_paths += %W( #{Rails.root}/app/models/namespace #{Rails.root}/app/models/other_namespace )
config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]
可以但会降低应用程序的运行速度,特别是在经常重新加载应用程序的开发模式下。原因是您不能将所有文件都添加到autoload_paths中,而只能将根文件夹添加到其中可以推断出文件名和模块的位置。简单来说,如果模型中只有一个级别的子文件夹,而没有名称空间模型,则只能这样做config.autoload_paths += Dir[Rails.root.join('app', 'models', '*/')]
,仅添加第一级子目录。相同lib
或其他路径。
auto_loading_paths
了,并为模型添加了推论。例如,如果有NameSpace::Model
,它将尝试在所有autoloading_paths中找到a path/namespace/model
。很明显,只有当path
一个目录时,这才可以匹配。根据经验,您应该仅在目录中具有autoload_paths
最大效率。希望能帮助到你。