代码之家  ›  专栏  ›  技术社区  ›  featureBlend

当我运行rake:db migrate命令时,我得到一个错误“Uninitialized constant CreateArticles”

  •  44
  • featureBlend  · 技术社区  · 16 年前

    我创建了一篇模型ruby脚本/生成模型文章(simple 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。”

    有人知道为什么这个错误一直发生吗?

    3 回复  |  直到 13 年前
        1
  •  118
  •   thetacom    16 年前

    确保你的文件名和类名是一样的(除了类名是驼峰大小写)。迁移文件的内容应该如下所示,并将其简化了一点:

    #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
    
        2
  •  9
  •   dgsan    7 年前

    如果您的类名与来自的词形变化(如首字母缩写)不匹配,则可能会出现给定的错误 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

        3
  •  3
  •   123    8 年前

    如果出现此错误,而不是因为迁移文件名,那么还有另一种可能的解决方案。在迁移中直接打开类,如下所示:

    class SomeClass < ActiveRecord::Base; end
    

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

        4
  •  2
  •   stevec Zxeenu    4 年前

    最重要的答案对我来说解决了。把这个留在这里以防万一。

    实例

    如果调用了迁移文件

    20210213040840_add_first_initial_only_to_users.rb
    

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

    AddFirstInitialOnlyToUsers
    

    注意:如果类名不匹配,即使差异只是小写,也会出错 t 不要在“To”中使用大写的“T”,所以要小心!