Ruby on Rails模型不遵循命名空间

时间:2012-08-13 08:15:10

标签: ruby-on-rails

我有一个名称空间中的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不能具有类似于引擎名称的命名空间名称吗?

2 个答案:

答案 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方法。