【问题标题】:Environment variables cached in Rails config?Rails 配置中缓存的环境变量?
【发布时间】:2015-03-26 22:10:17
【问题描述】:

这种行为真的让我很困惑。我的ENV 的内容或我的配置似乎缓存在某处。以下是如何重现它:

在一个新的应用程序中(我使用的是 Ruby 2.0.0 和 Rails 4.2.1),编辑 application.rb

$ cat config/application.rb 
require File.expand_path('../boot', __FILE__)

require 'rails/all'

Bundler.require(*Rails.groups)

module Myapp
  class Application < Rails::Application
    config.active_record.raise_in_transactional_callbacks = true

    config.env_foo = ENV['FOO']
  end
end

配置项env_foo现在是nil

$ unset FOO  # make sure FOO is unset
$ rails console
Loading development environment (Rails 4.2.1)
2.0.0-p598 :001 > Rails.application.config.env_foo
 => nil

设置一些环境变量,看看会发生什么:

$ export FOO=barbapapa
$ rails console
Loading development environment (Rails 4.2.1)
2.0.0-p598 :001 > Rails.application.config.env_foo
 => nil 
2.0.0-p598 :002 > ENV['FOO']
 => "barbapapa" 

所以缓存项仍然是nil,但ENV 已更改。即使我将环境更改为生产环境:

$ RAILS_ENV=production rails console
Loading production environment (Rails 4.2.1)
2.0.0-p598 :001 > Rails.application.config.env_foo
 => nil

此配置缓存在哪里以及如何使其反映新的ENV

注意:我知道还有其他配置 Rails 的方法,但我使用的是 Heroku,所以我认为鼓励使用环境进行配置。

【问题讨论】:

    标签: ruby ruby-on-rails-4 environment-variables


    【解决方案1】:

    Spring gem 在 Rails 4 的开发环境中默认预加载应用程序。

    要重新加载您的应用,只需终止当前项目的 spring 进程:

    spring stop
    

    Spring 似乎无法刷新环境更改,但它确实监视文件。如果您使用的是.env 文件,例如dotenv,您可以将其添加到config/spring.rb

    Spring.watch '.env'
    

    【讨论】:

    • 在提问的同时回答您自己的问题? :D
    • @lutfianasari 是的 :) 我知道这看起来很有趣,但实际上是值得鼓励的。 stackoverflow.com/help/self-answer
    • 啊,我明白了.. 我看到其他人也回答了他们自己的问题,但是您在上面的答案中说“你”,这让我产生疑问:D 抱歉我的无用评论并感谢您提供的信息链接:)
    • :-) 有时我只阅读答案,所以我想保持一致。我尝试坚持使用通用的 you 以减少混淆。 en.wikipedia.org/wiki/Generic_you
    猜你喜欢
    • 2012-03-04
    • 2022-08-13
    • 2019-12-22
    • 1970-01-01
    • 2021-07-14
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多