Ruby 2.4 Имя модуля конфликтует с именем класса моей модели - PullRequest
1 голос
/ 05 марта 2020

Я обновляю версию Ruby с 2.3.8 до 2.4.4 на Rails 5.2.3.

Когда я запускаю приложение, я получаю эту ошибку:

app/models/warning.rb:1:in `<main>': Warning is not a class (TypeError)

при вызове на консоли: Warning.class => Module

Но на самом деле это одна из моих моделей под названием Warning.

Я видел в опубликованных заметках введение в новый модуль на ruby 2.4 называется Warning. но как я могу избежать этого конфликта, не переименовывая мою модель с миграциями?

1 Ответ

3 голосов
/ 05 марта 2020
Модуль

Warning используется для переопределения метода ruby warn. Чтобы временно обойти ошибку - вы можете отменить определение константы перед определением вашей модели:

Object.send(:remove_const, :Warning)

Выполнение теста:

require "bundler/inline"
gemfile(true) do
  source "https://rubygems.org"
  gem "activerecord", "5.2.3"
  gem "sqlite3", "~> 1.3.6"
end

require "active_record"
require "minitest/autorun"
require "logger"

ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
ActiveRecord::Schema.define do
  create_table(:warnings, force: true){|t| t.string  :name }
end

RubyWarning = Warning
Object.send(:remove_const, :Warning)

class Warning < ActiveRecord::Base
end

def RubyWarning.warn(str)
  puts "still works: #{str}"
end

class SomeTest < Minitest::Test
  def test_stuff
    wrn = Warning.create name: 'test'
    assert_equal(wrn.name, 'test')
    warn "Test warn"
  end
end

...