gpt4 book ai didi

ruby-on-rails - 开发重新加载后 Rails 单例变空

转载 作者:行者123 更新时间:2023-12-02 03:23:51 24 4
gpt4 key购买 nike

在我的 Rails 应用程序中,我决定使用单例创建某种工厂来正确获取对象。

config/initializers/registry.rb:

registry = Registry.instance

registry.define_lazy :period_predictor do
PeriodPredictor.new(NotificationBuilder.new, 28, 4, 3)
end

registry.define_lazy :notification_sender do
NotificationSender.new
end

lib/registry.rb:

# Registry class which is singleton and stores values.
class Registry
include Singleton


# Define simple value. Like a constant.
#
# @param key [Symbol]
# @param value
def define(key, value)
container[key] = value
end


# Define value (block required) which will be calculated when it will be need.
# It will calculate it every time when it will be needed.
#
# @param key [Symbol]
# @param block [Proc]
def define_lazy(key, &block)
container[key] = LazyValue.new(&block)
end


# Get value.
#
# @param key [Symbol]
#
# @return
def get(key)
value = container[key]
if value.is_a?(LazyValue)
value = value.call
end

value
end


# Get value (hash access).
#
# @param key [Symbol]
#
# @return
def [](key)
get(key)
end


# Export all the values.
# Replacing values of returned hash won't change registry.
#
# @return [Hash]
def export
container.clone
end


# Import hash data to registry
#
# @param data [Hash]
def import(data)
data.each do |key, value|
@container[key] = value
end
end


private

# Get container.
#
# @return [Hash]
def container
@container ||= {}
end


# Class to store lazy value.
class LazyValue
def initialize(&block)
@block = block
end

def call
@block.call
end
end
end

生产中一切正常。但是当我更改某些内容(甚至在某处添加空间)时,我无法再在 Controller 中从单例获取数据。

Registry.instance 成为注册表的新实例并且Registry.instance[:period_predictor] 变为 nil

当我放弃单例并创建类方法时,也会发生同样的事情。

只有当我关闭单例并创建一个常量时,它才不会执行此操作:

registry = Registry.new

registry.define_lazy :period_predictor do
PeriodPredictor.new(NotificationBuilder.new, 28, 4, 3)
end

registry.define_lazy :notification_sender do
NotificationSender.new
end

REGISTRY = registry

Rails 版本 4.2.5.1

有人知道为什么会发生这种情况吗?

最佳答案

我发现,发生这种情况是因为 Rails 刷新了自动加载的常量。 http://guides.rubyonrails.org/autoloading_and_reloading_constants.html#constant-reloading

我在初始化程序的开头添加了一行 require "#{Rails.root}/lib/registry",一切正常。

关于ruby-on-rails - 开发重新加载后 Rails 单例变空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com