我有一个名称空间中的Rails 3.2.8模型。我确信它曾经是名称空间被自动扩展到表名的样子。例如Module :: Model将成为数据库中的module_model。
出于某种原因,我现在遇到一个问题,即这不会通过rails应用程序发生。迁移,模型和控制器都存在于命名空间中,但是当模型查找表时,它会忽略表前缀并抱怨它无法找到数据库。
以下是示例
module Magazine
def self.table_name_prefix
'magazine_'
end
end
module Magazine
class Paper < ActiveRecord::Base
#some stuff here
end
end
当我对Magazine :: Paper进行查询时,它会查找“paper”表而不是“maganzine_paper”表。这导致整个应用程序出现一些奇怪的行为。我还尝试使用self.table_name在模型中手动设置表名,但这只允许模型找到正确的表。路线仍然和我一起玩游戏,就像我在纸张下面嵌入一些东西,例如评论,然后它寻找一条不存在的路线。
这就是路线内部的内容。评论应该转到/ magazine / papers / 1 / comments,但它会寻找一条名为/ magazine / comments
的路线namespace :magazine do
resources :papers do
resources :comments
end
end
发生了什么事?
更新
好的,所以我想出来但不确定我是否应该忽略它或看看是什么导致它。引擎名称是杂志,在引擎中我为名为magazine的模型创建名称空间,但这会导致问题。因此rails不能具有类似于引擎名称的命名空间名称吗?
答案 0 :(得分:3)
我遇到了同样的问题,忘记了我的应用程序名称(主模块)与我的模型的命名空间同名。更改模块名称或应用程序名称可以解决此问题。
答案 1 :(得分:0)
如果你只是写
namespace :magazine do
resources :papers do
resources :comments
end
end
并运行rake路线,你可以看到它正在寻找合适的网址,当你说它正在寻找/magazine/comments
时,你肯定必须在文件的某处写入另一条路线。
当你写
module Magazine
def self.table_name_prefix
'magazine_'
end
end
当您使用相同的模块名称Magazine
编写模型时,您将使用其中的不同内容替换相同的模块。而不是在杂志模块中编写模型Paper,只需按照以下方式将模块包含在模型Paper中。
class Paper < ActiveRecord::Base
include Magazine
#some stuff here
end
这将确保在应用程序启动时加载模型时调用table_name_prefix方法。