Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在environment.rb中设置的常量将在开发模式中消失_Ruby On Rails_Ruby - Fatal编程技术网

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

Ruby on rails 在environment.rb中设置的常量将在开发模式中消失,ruby-on-rails,ruby,Ruby On Rails,Ruby,了解rails缓存工作原理的人可以在这里真正帮助我。下面是嵌套在Rails::Initializer.run块中的代码: config.after_initialize do SomeClass.const_set 'SOME_CONST', 'SOME_VAL' end 现在,如果我运行script/server并发出一个请求,那么一切都很顺利。然而,在对我的Rails应用程序的第二次请求中,由于一个统一化的常量错误,所有的请求都会失败。在生产模式下,我可以成功地发出第二个请求,这意味着

了解rails缓存工作原理的人可以在这里真正帮助我。下面是嵌套在Rails::Initializer.run块中的代码:

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
但现在这意味着每当我对某个_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.中设置常量,以便在初始化后\u prepare
而不是
config<在每次请求之前调用code>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

我仍然想知道为什么它对第一个请求有效,而不是对下面的请求有效。您知道有什么方法可以在环境文件中设置常量,使它们在开发模式下保持不变吗?我正在对某些_class.rb进行大量更改,不想继续重新启动服务器。谢谢,这正是我想要的答案。向@joshuaxls和@Sarah Mei拥抱和亲吻,哦,我的天,这真的帮了我大忙!在不运行初始值设定项的情况下重新加载类是一个非常。。。可能很聪明,但做起来很混乱。
# 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