Произвольная ошибка Ruby on Rails 5 NameError: неинициализированная константа в моделях пространства имен в консоли - PullRequest
0 голосов
/ 10 мая 2018

У меня есть эти две модели пространства имен в папке app / models / admin :

транзакцияtype.rb:

module Admin
  class TransactionType < ApplicationRecord
    self.table_name = "transactiontypes"

    has_many :transactions
  end
end

транзакция.rb:

module Admin
  class Transaction < ApplicationRecord
    self.table_name = "transactions"

    belongs_to :transactiontype
  end
end

Внутри schema.rb , определения таблиц выглядят так:

  create_table "transactiontypes", force: :cascade do |t|
    t.string "description", limit: 30, null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

create_table "transactions", force: :cascade do |t|
    t.string "description", limit: 30, null: false
    t.bigint "transactiontype_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

add_foreign_key "transactions", "transactiontypes"

Теперь, если я открою консоль рельсов и наберу:

Администратор :: TransactionType.all

Я получаю эту ошибку:

NameError: неинициализированная константа Admin :: TransactionType

Странно то, что я открывал и закрывал консоль в течение последнего часа, иногда она работала без ошибок (показывая правильный «SELECT» в консоли), иногда она получала сообщение NameError. Затем я выполнил команду rails restart , и с тех пор я получил NameError все время.

Буду признателен за любую помощь, спасибо.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

проверьте ваш schema.rb, здесь название модели transactiontypes и transactions. Так что вам не нужно добавлять self.table_name = "transactiontypes" и self.table_name = "transactions" на transactiontypes.rb и transactions.rb. Вместо этого просто измените папку app / models / admin :

транзакцияtype.rb:

module Admin
  class Transactiontype < ApplicationRecord
    has_many :transactions
  end
end

транзакция.rb:

module Admin
  class Transaction < ApplicationRecord
    belongs_to :transactiontype
  end
end

Теперь вы можете примерить консоль рельсов:

Admin::Transactiontype.all
0 голосов
/ 10 мая 2018

В соответствии с Соглашением об именах , вы создаете таблицу transactiontypes без подчеркивания.

Поэтому Rails пытается найти в вашей БД модель Admin::Transactiontype, а не Admin::TransactionType

...