我正在使用 Zeitwerk 加载器在 Rails 6 应用程序中实现一个单例类/模块。
# app/lib/mynamespace/mymodel.rb
module Mynamespace
module Mymodel
class << self
attr_accessor :client
end
def self.client
@client ||= "default_value"
end
def self.client=(client)
@client = client
end
end
单例类在初始化
# config/initializers/mymodel.rb
Mynamespace::Mymodel.client = "my_custom_value"
# Mynamespace::Mymodel.client - this returns correct value
然后当我在控制器中使用单例类时
# app/controllers/mycontroller.rb
client = Mynamespace::Mymodel.client
它返回一个空对象,因为它没有被初始化:client == "default_value" 但应该是 "my_custom_value"。
日志显示错误
DEPRECATION WARNING: Initialization autoloaded the constants Mynamespace::Mymodel
Autoloading during initialization is going to be an error condition in future versions of Rails.
使用 Zeitwerk 时如何正确配置单例类?