Rails,无法访问在命名空间内创建的模型

时间:2015-10-22 19:26:10

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我在命名空间“Module”中创建了一个名为“RandomStuff”的模型..但是当我在rails控制台中尝试Module::RandomStuff时。它给出了以下错误

  

Module :: RandomStuff(表不存在)

并且无法在我的rails应用中的任何位置访问它。当我在irb中运行ActiveRecord::Base.connection.tables表中列出了“module_random_stuffs”..

以下是我遵循的步骤,如果我遗漏了某些内容,请告诉我

rails generate model Module::RandomStuff

然后在迁移文件中添加了一列

    class CreateModuleRandomStuffs < ActiveRecord::Migration
  def change
    create_table :module_random_stuffs do |t|
      t.string :test_column
      t.timestamps null: false
    end
  end
end

然后运行以下命令

rake db:migrate

仍然我无法访问任何地方的模型..

2 个答案:

答案 0 :(得分:1)

感谢@DVG指出它。

我的模型Modul :: RandomStuff

中缺少以下行
  self.table_name = 'module_random_stuffs'

答案 1 :(得分:1)

我只是喜欢这些情况。

有时,当Rails无法加载某些内容时,就好像某些内容 从未存在。如果出于某种原因,某些常量(至少是类或模块,我已经看到它们)在其定义中有错误,但是因为它是可选的,所以不会抛出任何错误。

使用active_model_serializers时,我遇到了同样的问题。它试图从模型的名称推断出一个序列化器类。如果找不到匹配的那个,它会回到&#34; serializerless&#34;渲染。这使我困惑了一秒钟,我很确定我已经定义了它,即使是在正确的文件中。

在您的特定情况下,Rails必须定义一个名为Module的模块,以便在那里指定一个公共表前缀。像这样:

module Module
  def self.table_name_prefix
    'module_'
  end
end

但是尝试在Module中定义模块irb Ruby会拒绝

module Module
end
# TypeError: Module is not a module

它不是一个模块?呵呵。那是什么?

Module.class
# => Class

一堂课?这是对的,而且,它是Ruby core class。所以只需选择一个不同的模块名称。你选择的东西与真正必要的东西相撞。

Hacky模式(从未实际执行此操作,否则...... wat

您可以通过更改生成的module.rb,将module替换为class来解决此问题。这将重新打开Module类并在其中定义您的模型,使事情按预期工作。但从技术上讲,这是一个绝对不必要的monkeypatch。