Domanda Quando eseguo il rake: comando db migrate, ricevo un messaggio di errore "Costanti non inizializzate CreateArticles"


Ho creato un modello ruby ​​script / generate model Article (simple enuff)

Ecco il file di migrazione 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

Quando eseguo il rake: comando db migrate, ricevo un errore rake interrotto! "Costanti non inizializzati CreateArticles."

Qualcuno sa perché questo errore continua a succedere?


44
2018-01-05 13:53


origine


risposte:


Assicurati che il nome del tuo file e il nome della tua classe diano la stessa cosa (eccetto che il nome della classe è Camel Cased). I contenuti del tuo file di migrazione dovrebbero apparire in questo modo, semplificandoli un po 'anche:

#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

94
2018-01-05 14:33



Se ricevi questo errore e NON è a causa del nome del file di migrazione, esiste un'altra possibile soluzione. Apri la classe direttamente nella migrazione in questo modo:

class SomeClass < ActiveRecord::Base; end

Dovrebbe essere ora possibile utilizzare SomeClass all'interno della migrazione.


2
2018-01-10 19:55



È possibile ottenere l'errore dato se i nomi delle classi non corrispondono a flessioni (come gli acronimi) da config/initializers/inflections.rb.

Ad esempio, se le tue flessioni includono:

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

allora potresti aver bisogno di assicurarti che la classe nella tua migrazione sia:

class CreateDOGHouses < ActiveRecord::Migration[5.0]

piuttosto che:

class CreateDogHouses < ActiveRecord::Migration[5.0]

Non è molto comune, ma se si genera una migrazione o un modello o qualcosa del genere, e successivamente si aggiunge una parte di esso a inflessioni, può accadere. (L'esempio qui causerà NameError: uninitialized constant CreateDOGHouses se il tuo nome di classe è CreateDogHouses, almeno con Rails 5.)


1
2018-05-05 22:58