Railsチュートリアルで使われているRailsは4.0なのですが、最新のRailsは4.1です。で、3章の「リスト 3.2 秘密トークンを動的に生成する。」部分でconfig/initializers/secret_token.rbを編集とあるのですが、これが最新版のRails4.1では見つからない。

「多分これ4.0から4.1でなんか仕様の変更あったな?」と直感で思い、configの中を眺めてみると、config/secrets.ymlというトークンを管理するみたいなファイルが見つかった。

これっぽいなー。ちょっとRails4.0から4.1の変更点とか、secrets.ymlに関してちょっと調べてみる。

ふむ。Railsチュートリアル(4.0)のにあるコードは、

require 'securerandom'

def secure_token
  token_file = Rails.root.join('.secret')
  if File.exist?(token_file)
    # Use the existing token.
    File.read(token_file).chomp
  else
    # Generate a new token and store it in token_file.
    token = SecureRandom.hex(64)
    File.write(token_file, token)
    token
  end
end

SampleApp::Application.config.secret_key_base = secure_token

.secretファイルにsecurerandom(ランダム文字列を生成するgem)で生成した文字列を保存して、そのファイル(.secret)を.gitignoreしろと書いてある。

で、そういう固有の外部設定ファイルは極力設定すべきではないし、ハードコードで書くべきではないというモダンなAppの設計思考(The Twelve-Factor Appの中の第3章にある_設定をコードから厳密に分離すること_かな)みたいに、今後はdatabase.ymlみたいにsecrets.ymlという外部ファイルが用意されたと。

で、Rails4.1でrails newした時に生成されるsecrets.ymlがこんな感じ。

development:
  secret_key_base: aaa

test:
  secret_key_base: bbb

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

productionの所を見ると、<%= ENV["SECRET_KEY_BASE"] %>ってあるから、これって環境変数から取るって事かな?おそらくherokuとかだとこのままの状態でgit push heroku masterすればよしなに動いてくれるはず。

というわけで、適当なタイミングでgit push heroku masterしてみる。……うん、やっぱり動く。

で、気になるのはこのsecrets.ymlファイルを.gitignoreに書くべきかどうなのかだけど、<%= ENV["SECRET_KEY_BASE"] %>という書き方ならcommitしてもいいのかな?……というか_productionでは環境変数使いますねという事を表現する必要がある_からcommitすべきなのか。

で、これがheroku以外だとrake secretと打てばsecurerandomでランダム文字列が生成されるから、スケジュールとかなんらかのタイミングでその文字列を本番サーバーの環境変数に設定すると。ちょっと調べてきれてないけど、そもそもRailsの起動時に設定する方法がありそう。

で、他にはsecurerandamで生成される文字列をコードに埋め込んじゃうパターン。

development:
  secret_key_base: aaa

test:
  secret_key_base: bbb

production:
  secret_key_base: ccc

こうするなら_.gitignoreにconfig/secrets.ymlを追加しないとヤバい_ので、追記してデプロイ時にsecrets.ymlを含めると。

個人的にはデフォルトの<%= ENV["SECRET_KEY_BASE"] %>でアップロードする方が管理も楽だしキレイな気がする。