Ruby 2.4模块名称与我的模型类名称冲突

问题描述 投票:1回答:1

我正在Rails 5.2.3上将Ruby的版本从2.3.8升级到2.4.4。

启动应用程序时出现此错误:

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

在控制台上调用时:Warning.class => Module

但是实际上,这是我的一个名为Warning的模型。

我在发行说明中看到了对红宝石2.4上称为警告的新模块的介绍。但是如何避免这种冲突而不用迁移来重命名model

ruby-on-rails ruby ruby-on-rails-5 upgrade
1个回答
1
投票
时,警告不是类(TypeError)。

Warning模块用于覆盖红宝石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

© www.soinside.com 2019 - 2024. All rights reserved.