【发布时间】:2015-02-13 12:54:49
【问题描述】:
我试图在 Rails 应用程序中一致地使用嵌套的模块/类定义,而不是紧凑的 (::) 语法。但是,它并不总是加载包含table_name_prefix 的模块文件本身。
在 Ruby 2.1.1 上使用 Rails 4.1.8...
rails new my_app
...
rails g scaffold User
rails g scaffold Blog::Post
这会创建app/models/blog.rb:
module Blog
def self.table_name_prefix
'blog_'
end
end
似乎有很多方法可以意外阻止 Rails 自动加载 blog.rb。最简单的例子是通过助手。
将app/helpers/blog/posts_helper.rb 更改为:
module Blog::PostsHelper
end
到:
module Blog
module PostsHelper
end
end
启动服务器,访问/users,然后访问/blog/posts:
SQLite3::SQLException: no such table: posts: SELECT "posts".* FROM "posts"
在其他地方也可能出现类似问题,例如在模型测试中。它不仅限于助手。
解决此问题的最佳方法是什么?显式加载 blog.rb 和任何其他命名空间模块?
【问题讨论】:
-
我能够重现该问题 - 感谢 Anthony。我会在 github 上创建一个问题,看看团队怎么说。
-
也许...虽然我更多的是寻找确保
blog.rb被加载的最佳方法,而不是建议对Rails 进行更改。这显然不是很多人遇到的问题......
标签: ruby-on-rails ruby namespaces