gpt4 book ai didi

ruby-on-rails - environment.rb 中设置的常量在开发模式中消失

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:34 26 4
gpt4 key购买 nike

了解 Rails 缓存如何工作的人可以真正帮助我。这是嵌套在 Rails::Initializer.run block 中的代码:

config.after_initialize do
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end

现在,如果我运行 script/server 并发出请求,一切都很好。然而,在我的 Rails 应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。

我已通过将以上内容更改为以下内容来解决问题:

config.after_initialize do
require 'some_class' # in RAILS_ROOT/lib/some_class.rb
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end

但是现在这意味着每当我对 some_class.rb 进行更改时,我都必须重新启动服务器。有没有办法在环境文件中设置常量并让它们在开发模式下正常工作?为什么第一个请求有常量,后面的请求没有?

更新:由于 environment.rb 仅在启动 Rails 应用程序时读取,并且我希望在每次请求时重新加载我的 lib 文件和模型,因此我被迫将常量移动到some_class.rb 文件如下:

if Rails.env.development?
const_set 'SOME_CONST', 'SOME_DEVELOPMENT_VAL'
end

在 environments/production.rb 中,我有旧的 const_set 代码。

更新下面详细介绍了使用 config.to_prepare 的更好方法。

最佳答案

它仅适用于开发模式下的第一个请求,因为类会在每次请求时重新加载。所以在第一个请求中,常量被设置在初始化器中,一切都很好。然后在下一个请求中,它会重新加载类,而无需从您的初始化程序中重新运行该位,因此不会从那里开始设置常量。

它在生产模式下工作,因为不会为每个请求重新加载类,因此您不会每次都丢失那部分类状态。

因此您可能希望在模型中或在 config.to_prepare 而不是 config.after_initialize 中设置常量。 to_prepare 在每个请求之前被调用。

在模型中:

class SomeClass < ActiveRecord::Base
MY_CONST = "whatever"

# You can access MY_CONST directly, but I tend to wrap them in a class
# method because literal constants often get refactored into the database.
def self.my_const
MY_CONST
end
end

在配置中:

# This will run before every single request. You probably only want this in
# the development config.
config.to_prepare do
SomeClass.const_set 'SOME_CONST', 'SOME_VAL'
end

关于ruby-on-rails - environment.rb 中设置的常量在开发模式中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/746063/

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