这种行为让我很困惑。好像我的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,所以我认为鼓励使用环境进行配置。
答案 0 :(得分:17)
Spring gem默认在Rails 4的开发环境中预加载应用程序。
要重新加载您的应用,只需终止当前项目的弹出流程:
spring stop
Spring似乎无法刷新环境更改,但它确实监视文件。如果您使用.env
文件,例如dotenv,则可以将其添加到config/spring.rb
:
Spring.watch '.env'