【问题标题】:Missing secret_key_base in rails productionRails 生产中缺少 secret_key_base
【发布时间】:2015-07-12 01:52:33
【问题描述】:

我不明白为什么找不到我的 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"] %>

当我用生成的密钥替换 &lt;%= ENV["SECRET_KEY_BASE"] %&gt; 时,它可以工作,否则,不推荐......

所以我把我的钥匙放在/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 变量在这个文件中对于 Ruby 是 nil,但在解析文件时也在 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 变量,我去看看...

【问题讨论】:

  • 添加了错误的完整跟踪日志...
  • @Nithin 我每次进行更改时都会重新启动服务器,但问题仍然存在
  • 您是否设置了实际的环境变量?看起来您正确引用了所有内容,但可能只是没有填充。检查这篇文章。它将向您展示如何设置它。 railsapps.github.io/rails-environment-variables.html
  • 尝试在您的终端中使用 export SECRET_KEY_BASE="mykey" 之类的设置。

标签: ruby-on-rails secret-key


【解决方案1】:

我对 EDIT #1 的假设是正确的。问题是 rvmsudo 在某些条件下传递环境变量,这些条件可以在 grep 命令上找到:

https://github.com/rvm/rvm/blob/dff3eeac883ce6314c021f3d00730bcd5a628e3e/binscripts/rvmsudo#L46

所以我将我的环境变量名称更改为:http_SECRET_KEY_BASE 尝试并成功了!

【讨论】:

  • 我刚刚使用了你的建议,它马上就奏效了。我在第三周学习 ruby​​,在第三天尝试学习 rails。你有解释为什么会这样吗?
猜你喜欢
  • 2014-07-06
  • 2017-06-02
  • 1970-01-01
  • 2016-03-29
  • 2016-01-12
  • 2014-06-23
  • 2016-11-05
  • 2014-06-04
相关资源
最近更新 更多