Rails 4:在子路径中组织rails模型而不使用命名空间模型?

时间:2013-09-21 15:02:49

标签: ruby-on-rails namespaces ruby-on-rails-4 models subdirectory

是否有可能拥有这样的东西?

app/models/
app/models/users/user.rb
app/models/users/education.rb

目标是更好地组织 / app / models 文件夹,但无需命名模型。

Rails 3的一个悬而未决的问题是: Rails 3.2.9 and models in subfolders

使用命名空间指定table_name似乎有效(请参阅Rails 4 model subfolder),但我想在没有命名空间的情况下执行此操作

1 个答案:

答案 0 :(得分:106)

默认情况下,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 +

的更新

从Rails 4.1开始,默认情况下,应用生成器不包含config.autoload_paths。所以,请注意上面的内容确实属于 config / application.rb

更新

修复了上述代码中的自动加载路径示例,使用{*/}代替{**}。请务必阅读muichkine's comment了解详细信息。