2014-01-15 21 views
5

我讀http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html ,看到那裏config/secrets.yml使用config/secrets.yml 4.0.2版本

我搬到我的secret_base_keys該文件,並刪除secret_token.rb文件的伎倆。

但服務器無法啓動。

DEPRECATION WARNING: You didn't set config.secret_key_base. Read the upgrade documentation to learn more about this new config option. (called from service at /home/bismailov/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/webrick/httpserver.rb:138) 
[2014-01-15 16:15:51] ERROR RuntimeError: You must set config.secret_key_base in your app's config. 

我相信那是因爲我還沒有使用Rails 4.1。

有什麼辦法可以在Rails 4.0版本中實現這個新功能(secrets.yml)嗎?也許某種寶石...

非常感謝!

+0

運行耙祕密,然後啓動服務器做到了從Rails的4.1借用一些代碼在上面的鏈接中提到。 –

+0

我嘗試'耙祕密'沒有。但'rake secret'起作用,我生成了兩個用於secrets.yml的祕密標記 –

回答

19

secret_key_base棄用似乎沒有替代語法來刪除Rails 4.0應用程序中的棄用警告。要滿足棄用,請按照將生產密鑰移至secrets.yml並刪除secret_token.rb文件的步驟操作。在你的application.rb中實現一個YAML加載器來從你的secrets.yml文件中提取令牌。使用rake secret爲您的每個環境生成一個新的令牌。將輸出複製並粘貼到secrets.yml文件的每個部分。

# config/secrets.yml 
development: 
    secret_key_base: __pasted from rake secret___ 
test: 
    secret_key_base: __pasted from rake secret___ 
production: 
    secret_key_base: __pasted token from config/initializers/secret_token.rb___ 


# config/application.rb 
# TODO Remove this in Rails 4.1 
config.secret_key_base = YAML.load(File.open("#{Rails.root}/config/secrets.yml"))[Rails.env]['secret_key_base'] 

引用:https://github.com/rails/rails/pull/13298

UPDATE:

我原來的職位集中在靈感來自@ user2998870,我加入到我的application.rb的方法是允許一個實現多個祕密,不只是secret_key_base。這使得頂級密鑰可以作爲方法訪問,例如, Rails.application.secrets.braintree_merchant_id

如果嵌套,可以使用Rails.application.secrets.braintree['merchant_key']調用嵌套鍵值。

注意:上述原始代碼仍然需要secret_key_base才能在Rails 4.0中正常運行。

# config/application.rb 
def secrets 
    @secrets ||= begin 
    yaml = YAML.load(File.open("#{Rails.root}/config/secrets.yml"))[Rails.env] 
    ActiveSupport::OrderedOptions.new.merge!(yaml.symbolize_keys) 
    end 
end 
4

config/secrets.yml是Rails 4.1的一個特性。升級到Rails 4.1以使用該功能。

1

我不喜歡@ scarver2提及,但我(我目前使用的4.0.3)

# Load 3rd party service passwords from config/services.rb. 
# This is patch code to support config/services.rb till we upgrade to Rails 4.1. 
# TODO: Remove this section after upgrading to Rails 4.1. 

# Borrowed from rails/railties/lib/rails/application/configuration.rb 
config.paths.add "config/secrets", with: "config/secrets.yml" 

# Borrowed from rails/railties/lib/rails/application.rb 
def secrets #:nodoc: 
    @secrets ||= begin 
    secrets = ActiveSupport::OrderedOptions.new 
    yaml = config.paths["config/secrets"].first 
    if File.exist?(yaml) 
     require "erb" 
     all_secrets = YAML.load(ERB.new(IO.read(yaml)).result) || {} 
     env_secrets = all_secrets[Rails.env] 
     secrets.merge!(env_secrets.symbolize_keys) if env_secrets 
    end 

    # Fallback to config.secret_key_base if secrets.secret_key_base isn't set 
    secrets.secret_key_base ||= config.secret_key_base 

    secrets 
    end 
end