Rails2.2でサンプルアプリを作ってみる(4)

Rails2.2を利用したサンプルアプリ作成の続きです。

すでにここまで作成が終わっているものとして話を進めていきます。

  1. Rails2.2でサンプルアプリを作ってみる(1) - 積み重ねた日々
  2. Rails2.2でサンプルアプリを作ってみる(2) - 積み重ねた日々
  3. Rails2.2でサンプルアプリを作ってみる(3) - 積み重ねた日々

今回の作業内容

今回は、以下の変更を行っていきたいと思います。

  • セッションデータをデータベースへ格納する

セッションデータをデータベースへ格納する

セッションデータをデータベースに格納するためにテーブルを作成する必要があるので、rakeタスクを実行します。

$ rake db:sessions:create
(in /Users/kouichi/Development/Ruby/depot)
      exists  db/migrate
      create  db/migrate/20081217145306_create_sessions.rb

作成されたマイグレーション db/migrate/20081217145306_create_sessions.rb の中身を見ると、sessionsというテーブルが作成されることが分かります。

class CreateSessions < ActiveRecord::Migration
  def self.up
    create_table :sessions do |t|
      t.string :session_id, :null => false
      t.text :data
      t.timestamps
    end

    add_index :sessions, :session_id
    add_index :sessions, :updated_at
  end

  def self.down
    drop_table :sessions
  end
end

このマイグレーションを適用します。

$ rake db:migrate
(in /Users/kouichi/Development/Ruby/depot)
==  CreateSessions: migrating =================================================
-- create_table(:sessions)
   -> 0.0919s
-- add_index(:sessions, :session_id)
   -> 0.1327s
-- add_index(:sessions, :updated_at)
   -> 0.0980s
==  CreateSessions: migrated (0.3230s) ========================================

念のため、テーブルが作成されていることを確認しておきます。

depot@localhost[depot_development]> show columns from sessions;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment | 
| session_id | varchar(255) | NO   | MUL | NULL    |                | 
| data       | text         | YES  |     | NULL    |                | 
| created_at | datetime     | YES  |     | NULL    |                | 
| updated_at | datetime     | YES  | MUL | NULL    |                | 
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

このままでは、セッションデータをデータベースに格納しないので、データベースに格納するように設定を変更します。変更するファイルは、config/environment.rb になり、以下の

  # config.action_controller.session_store = :active_record_store

の行のコメントアウトを外します。

   config.action_controller.session_store = :active_record_store

その後、セッションキーと protect_from_forgeryの設定を行う必要があります。これは、app/controllers/application.rb ファイルを編集します。

  session :session_key => '_depot_session_id'

を追加し、

  protect_from_forgery # :secret => 'd78661082213fef4224e6ba65150a30b'

の行のコメントアウトを外して、以下のように変更します。

  protect_from_forgery :secret => 'd78661082213fef4224e6ba65150a30b'

この protected_form_forgery ですが、CSRF(Cross-Site Request Forgery)から保護するためにRails2.0から導入されたようです。

この変更作業を忘れると「ActionController::InvalidAuthenticityToken」とエラーが発生してしますので、注意してください。

変更後は忘れずにscript/serverを起動しなおします。

ブラウザでアクセスし、セッションデータがデータベースに格納されたことを確認します。

depot@localhost[depot_development]> select * from sessions;
+----+----------------------------------+----------------------------------------------------------------------------------------+---------------------+---------------------+
| id | session_id                       | data                                                                                   | created_at          | updated_at          |
+----+----------------------------------+----------------------------------------------------------------------------------------+---------------------+---------------------+
|  6 | 6a91b1c08977292f0eddaebeb351527c | BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA== | 2008-12-17 15:21:26 | 2008-12-17 15:21:26 | 
+----+----------------------------------+----------------------------------------------------------------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)

今回はあまり進んでませんが、次回に続きます。
Rails2.2でサンプルアプリを作ってみる(5) - 積み重ねた日々 へ続きます。