2015-05-02 6 views
1

Я не понимаю, почему моя secret_key_base не найдена. Когда я начинаю мое приложение в производстве я получаю это сообщение в веб-браузере: Missing 'secret_key_base' for 'production' environment, set this value in 'config/secrets.yml'Отсутствует secret_key_base в производстве рельсов

Мои 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 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' 

EDIT 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 рельсы S -e «производство» -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, я буду смотреть на него ...

+0

выглядит отлично .. – Nithin

+0

добавлен полный журнал трассировки ошибки ... –

+0

сервер перезагрузки? – Nithin

ответ

1

Мое предположение о EDIT # 1 правда. Вопрос заключается в том, что rvmsudo проходят переменные среды под Somes условий, которые могут быть найдены на grep команды здесь:

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

Так я изменить имя переменной среды для: http_SECRET_KEY_BASE попробовать и это сработало!

+0

Я только что использовал ваше предложение, и оно сразу сработало.Я нахожусь на третьей третьей неделе обучения рубину и на третий день пытаюсь изучить рельсы. У вас есть объяснение, почему это работает? – mwangi