【问题标题】:Ruby 2.4 module name conflict with my model class nameRuby 2.4 模块名称与我的模型类名称冲突
【发布时间】:2020-06-18 06:21:49
【问题描述】:

我正在 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

我在已发布的注释中看到了关于 ruby​​ 2.4 上一个名为 Warning 的新 模块 的介绍。 但是如何在不使用迁移重命名我的 模型 的情况下避免这种冲突?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 upgrade ruby-2.4


    【解决方案1】:

    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
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-21
      • 2011-07-17
      • 2021-10-15
      • 2010-11-05
      • 1970-01-01
      • 2016-04-30
      • 2016-10-06
      相关资源
      最近更新 更多