Rails生产环境中缺少secret_key_base

3
我不明白为什么找不到我的secret_key_base。在生产环境下启动应用程序时,Web浏览器会显示此消息: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控制台时,我可以看到我的key:
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进行了一些调试跟踪。看起来,在这个文件中以及在解析config/secret.yml文件时,我的环境变量对于Ruby来说是nil

以下是我在解析过程中放置在文件上的日志:

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没有传递环境变量,我会查看一下...


添加了完整的错误跟踪日志... - ZazOufUmI
@Nithin 我每次做更改时都会重启服务器,但问题仍然存在。 - ZazOufUmI
你是否设置了实际的环境变量?看起来你引用的一切都是正确的,但它可能只是没有被填充。请参考这篇文章。它将告诉你如何设置它。http://railsapps.github.io/rails-environment-variables.html - Ryan-Neal Mes
尝试在生产环境中通过终端设置类似于 export SECRET_KEY_BASE="mykey" 的内容。 - Ryan-Neal Mes
1个回答

2

我刚刚使用了你的建议,它立刻就起效了。我正在学习 Ruby 的第三个星期,尝试学习 Rails 已经三天了。你能解释一下这为什么有效吗? - mwangi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接