Ruby 2.4 模块名称与我的模型冲突 class 名称
Ruby 2.4 module name conflict with my model class name
我要在 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
。
但是如何在不使用迁移重命名我的 模型 的情况下避免这种冲突?
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
我要在 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
。
但是如何在不使用迁移重命名我的 模型 的情况下避免这种冲突?
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