我正试图在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
。 最简单的例子是通过helpers。
将app/helpers/blog/posts_helper.rb
改为:
module Blog::PostsHelper
end
to:
module Blog
module PostsHelper
end
end
启动服务器,访问
/users
,然后访问/blog/posts
:SQLite3::SQLException: no such table: posts: SELECT "posts".* FROM "posts"
类似问题还可能在其他地方出现,比如模型测试中。这不仅限于helpers。
最好的解决方法是明确加载
blog.rb
和任何其他命名空间模块吗?
blog.rb
被加载的最佳方法,而不是建议改变Rails。显然,这不是许多人遇到的问题... - Anthony Smith