クッキーストア

2008/12/16

前回は、rake db:initialize がエラーを起こしたところで終わりました。

エラーメッセージに

undefined method `cache_template_extensions=' for ActionView::Base:Class

と出ていましたので、これを頼りに Google で情報を探すと、http://whatdoesthiserrormean.com/errors/1264 に答えがありました。

config.action_view.cache_template_extensions= で始まる行を config/environments.development.rb から削除すればよいそうです。

      *******************************************************************
      * config.breakpoint_server has been deprecated and has no effect. *
      *******************************************************************

という警告も表示されていたので、ついでにconfig.breakpoint_server = true の行も削除しておきましょう。

再度 rake db:initialize を実行すると、何の問題も生じません。


次に、Web サーバーを起動してみます。

起動時にはエラーは出ません。

しかし、トップページを表示してみると…

Status: 500 Internal Server Error
A secret is required to generate an integrity hash for cookie session data.
Use config.action_controller.session = { :session_key => "_myapp_session",
:secret => "some secret phrase of at least 30 characters" } in config/environment.rb

というエラーが出ます。

ふむ、これは Rails 2.1 で登場したクッキーストアに関連する問題ですな。

クッキーストアとは

セッションデータをクッキーに格納するセッション管理方式のこと。

伝統的なセッション管理方式では、セッションデータがサーバーサイド(ファイル、データベース、キャッシュシステム等)に格納され、クッキーにはセッションの ID だけが格納される。

クッキーストアには、他の方式と比較してサーバーサイドへの負荷を減らす効果がある。

クッキーに格納するデータには 4KB のサイズ制限があるが、Rails アプリケーションでは通常、セッションにユーザー ID とフラッシュメッセージしか格納しないので問題はない。

なお、クッキーにはデータのハッシュ値も一緒に格納されるため、ユーザーがセッションデータを変更することはできない(読むことはできる)。

エラーメッセージに書いてある通り、config/environment.rb に次のような記述を追加します。。

  config.action_controller.session = {
    :session_key => "_asagao_session",
    :secret => "d037a8c060089047375b82d9df5e732e"
  }

追加する位置は、

Rails::Initializer.run do |config|
  ...
end

の内側です。

なお、:secret オプションに格納する値は何でもいいのですが、30文字以上のランダムな文字列である必要があります。

ruby script/console で Rails コンソールを起動して、ActiveSupport::SecureRandom.hex(64) を実行すると、Rails がアプリケーションを作るときと同じ方法でランダムな文字列を生成することができます。

Ctrl+C で Web サーバを止めて、起動し直します。トップページをリロードすると…無事、表示されました。

本日は、ここまで。