3

我有一个位于命名空间中的 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

到底是怎么回事?

更新:

好的,所以我想通了,但不确定是否应该忽略它或查看是什么原因造成的。引擎名称是杂志,在引擎中我为名为杂志的模型创建了一个命名空间,但这会导致问题。所以rails不能有一个类似于引擎名称的命名空间名称吗?

4

2 回答 2

3

我遇到了同样的问题,忘记了我的应用程序的名称(主模块)与我的模型的命名空间具有相同的名称。更改模块名称或应用程序名称可以解决此问题。

于 2013-12-03T19:09:42.677 回答
0

如果你只是写

namespace :magazine do
 resources :papers do 
  resources :comments
 end
end

并运行 rake 路由,您会看到它正在寻找正确的 url,当您说它正在寻找时,/magazine/comments您肯定必须在文件中的某处写了另一条路由。当你写

module Magazine
 def self.table_name_prefix
  'magazine_'
 end
end

当您使用相同的模块名称编写模型时,您将使用其中的Magazine不同内容替换相同的模块。而不是在杂志模块中编写模型纸张,只需按以下方式将模块包含在模型纸张中。

class Paper < ActiveRecord::Base
  include Magazine
  #some stuff here
end

这将确保在您的应用程序启动时加载您的模型时调用您的 table_name_prefix 方法。

于 2012-08-13T09:38:42.583 回答