环境变量缓存在Rails配置中?

And*_*zlo 12 ruby environment-variables ruby-on-rails-4

这种行为让我很困惑.似乎我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
Run Code Online (Sandbox Code Playgroud)

配置项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
Run Code Online (Sandbox Code Playgroud)

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

$ 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" 
Run Code Online (Sandbox Code Playgroud)

因此缓存项目仍然存在nilENV已更改.即使我将环境改为生产:

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

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

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

And*_*zlo 19

春天的宝石默认情况下,在轨道4的开发环境预加载的应用程序.

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

spring stop
Run Code Online (Sandbox Code Playgroud)

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

Spring.watch '.env'
Run Code Online (Sandbox Code Playgroud)

  • @lutfianasari 是的:)我知道这看起来很有趣,但实际上是受到鼓励的。https://stackoverflow.com/help/self-answer (2认同)