我不明白为什么找不到我的secret_key_base。在生产环境中启动我的应用程序时,我在网络浏览器上收到以下消息:Missing 'secret_key_base' for 'production' environment, set this value in 'config/secrets.yml'
我的config/secret.yml
样子是这样的:
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
当我用<%= ENV["SECRET_KEY_BASE"] %>
生成的密钥替换它时,它将起作用,否则,不建议使用...
所以我把我的钥匙/etc/profile
&~/.bashrc
&~/.rvm/environment/ruby-2.1.5
如下:
export SECRET_KEY_BASE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
在生产模式下启动Rails控制台时,我可以看到我的钥匙:
rails c production
Loading production environment (Rails 4.1.6)
2.1.5 :001 > ENV["SECRET_KEY_BASE"]
=> "XXXXXXXXXXXXXXXXXXXXX"
我不知道为什么所有这些都不起作用。我是否缺少明显的东西?
完整的错误日志:
ERROR RuntimeError: Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`
/home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb:462:in `validate_secret_key_config!'
/home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb:195:in `env_config'
/home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/engine.rb:510:in `call'
/home/xxx/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb:144:in `call'
/home/xxx/.rvm/gems/ruby-2.1.5/gems/rack-1.5.2/lib/rack/lock.rb:17:in `call'
/home/xxx/.rvm/gems/ruby-2.1.5/gems/rack-1.5.2/lib/rack/content_length.rb:14:in `call'
/home/xxx/.rvm/gems/ruby-2.1.5/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:in `service'
/home/xxx/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service'
/home/xxx/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run'
/home/xxx/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'
编辑1:
我看了一下,~/.rvm/gems/ruby-2.1.5/gems/railties-4.1.6/lib/rails/application.rb
并使用进行了一些调试跟踪puts
。看起来我的ENV变量nil
在此文件中也适用于Ruby,而且在config/secret.yml
解析文件时也适用。
这是我在解析过程中放入文件的日志:
secrets = ActiveSupport::OrderedOptions.new
yaml = config.paths["config/secrets"].first
if File.exist?(yaml)
puts "FILE EXIST !"
puts ENV["SECRET_KEY_BASE"]
require "erb"
all_secrets = YAML.load(ERB.new(IO.read(yaml)).result) || {}
puts all_secrets.inspect
env_secrets = all_secrets[Rails.env]
puts env_secrets.inspect
secrets.merge!(env_secrets.symbolize_keys) if env_secrets
puts secrets.inspect
end
这是当我使用rvmsudo rails s -e“ production” -p 80启动服务器时的结果
FILE EXIST !
<-------------- (nil)
{"development"=>{"secret_key_base"=>"OK"}, "test"=>{"secret_key_base"=>"OK"}, "production"=>{"secret_key_base"=>nil}}
{"secret_key_base"=>nil}
{:secret_key_base=>nil}
看起来rvmsudo没有传递env变量,我来看一下...
我对EDIT#1的假设是正确的。问题是rvmsudo在某些条件下传递环境变量,这些条件可以在grep
此处的命令中找到:
https://github.com/rvm/rvm/blob/dff3eeac883ce6314c021f3d00730bcd5a628e3e/binscripts/rvmsudo#L46
因此,我将环境变量名称更改为:http_SECRET_KEY_BASE
尝试并成功了!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句