当我运行rake:db migrate命令时出现错误“未初始化的常量CreateArticles”

时间:2009-01-05 13:53:34

标签: ruby-on-rails rake rails-migrations

我创建了一个模型ruby脚本/生成模型文章(简单的enuff)

以下是迁移文件create_articles.rb:

def self.up
  create_table :articles do |t|
    t.column :user_id, :integer
    t.column :title, :string
    t.column :synopsis, :text, :limit => 1000
    t.column :body, :text, :limit => 20000
    t.column :published, :boolean, :default => false
    t.column :created_at, :datetime
    t.column :updated_at, :datetime
    t.column :published_at, :datetime
    t.column :category_id, :integer
  end

def self.down
  drop_table :articles
 end
end

当我运行rake:db migrate命令时,我收到一个错误rake中止! “未初始化的常量CreateArticles。”

有谁知道为什么会出现这种错误?

4 个答案:

答案 0 :(得分:97)

请确保您的文件名和类名称相同(除了类名称是驼峰)。迁移文件的内容应如下所示,简化它们:

#20090106022023_create_articles.rb
class CreateArticles < ActiveRecord::Migration   
  def self.up
    create_table :articles do |t|
      t.belongs_to :user, :category
      t.string :title
      t.text :synopsis, :limit => 1000
      t.text :body, :limit => 20000
      t.boolean :published, :default => false
      t.datetime :published_at
      t.timestamps
    end
  end

  def self.down
    drop_table :articles
  end
end

答案 1 :(得分:3)

如果由于迁移文件名而导致此错误并且不是,则还有另一种可能的解决方案。直接在迁移中打开类,如下所示:

class SomeClass < ActiveRecord::Base; end

现在应该可以在迁移中使用SomeClass

答案 2 :(得分:2)

最佳答案为我解决了。留在这里以防万一。

示例

如果您的迁移文件被调用

20210213040840_add_first_initial_only_to_users.rb

那么迁移文件中的类名应该是

AddFirstInitialOnlyToUsers

注意:如果类名不匹配,即使区别只是小写的 t 而不是大写的 'To' 中的 'T',它也会出错 - 所以要小心!

答案 3 :(得分:1)

如果您的班级名称与config/initializers/inflections.rb的变形曲目(如首字母缩略词)不匹配,则可能会收到给定的错误。

例如,如果您的变形包括:

ActiveSupport::Inflector.inflections(:en) do |inflect|
  inflect.acronym 'DOG'
end

然后您可能需要确保迁移中的类是:

class CreateDOGHouses < ActiveRecord::Migration[5.0]

而不是:

class CreateDogHouses < ActiveRecord::Migration[5.0]

不是很常见,但如果您生成迁移或模型或其他内容,然后将其中的一部分添加到变形中,则可能会发生。 (如果您的班级名称为NameError: uninitialized constant CreateDOGHouses,此处的示例将导致CreateDogHouses,至少使用Rails 5。)