web-dev-qa-db-fra.com

Quand j'exécute le râteau: dB migrer la commande, je reçois une erreur "créatures constantes non initialisées"

J'ai créé un modèle Ruby Script/Generate Article modèle (simple enuff)

Voici le fichier de migration 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

Lorsque j'exécute le râteau: DB Migrer la commande Je reçois une erreur RAKE ANTORTED! "Créatures constantes non initialisées."

Est-ce que quelqu'un sait pourquoi cette erreur continue à se produire?

48
featureBlend

Assurez-vous que votre nom de fichier et votre nom de classe indiquent la même chose (à l'exception du nom de la classe correspond au chameau) .Le contenu de votre fichier de migration devrait ressembler à quelque chose comme ça, les simplifieds un peu aussi:

#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
101
thetacom

Si vous obtenez cette erreur et que ce n'est pas à cause du nom du fichier de migration, il existe une autre solution possible. Ouvrez la classe directement dans la migration comme celle-ci:

class SomeClass < ActiveRecord::Base; end

Il devrait maintenant être possible d'utiliser SomeClass dans la migration.

3
123

Il est possible d'obtenir une erreur donnée si vos noms de classe ne correspondent pas aux inflexions (comme des acronymes) de config/initializers/inflections.rb.

Par exemple, si vos inflexions comprennent:

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

ensuite, vous devrez peut-être vous assurer que la classe de votre migration est la suivante:

class CreateDOGHouses < ActiveRecord::Migration[5.0]

plutôt que:

class CreateDogHouses < ActiveRecord::Migration[5.0]

Pas super commun, mais si vous génèverez une migration ou un modèle ou quelque chose, puis y ajouter une partie aux inflexions après cela peut arriver. (L'exemple ici va causer NameError: uninitialized constant CreateDOGHouses Si votre nom de classe est CreateDogHouses, au moins avec Rails 5.)

1
dgsan