2010-02-07

ActiveScaffoldでデータを保存する際にsessionに格納されている情報を利用する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsではマスタメンテナンス系のためにScaffoldがありますが、そんなScaffoldを素敵にしてくれるActiveScaffoldがお気に入りなのです。

ActiveScaffoldのインストール方法や利用方法は検索すればすぐわかると思いますので割愛します。

そんなActiveScaffoldで特定のカラムにsessionに格納されているデータを利用して格納する場合です。
ある情報を誰が作成更新したかなどをsessionに格納しているlogin情報などを利用して更新する場合などを想定しています。

仮に以下のようなtestsテーブルがあるとします。
id
data
data2
recorder
create_at
updated_at
このrecorder部分にデータを作成または更新した人の情報を格納するものとします。
更新した人の情報はsession[:login]に格納されているものとします。

このtestsテーブルのメンテナンス画面をActiveScaffoldを利用する場合です。
モデルは定義済みとしてcontrollerは、以下のようにすればOKです。
class TestController < ApplicationController
  active_scaffold :tests do |config|
    config.label = "テストメンテナンス画面"

    config.columns = [:data,
                      :data2]
    config.columns[:data].label    = "登録必須データ"
    config.columns[:data].required = true
    config.columns[:data2].label         = "登録必須でないデータ"
    config.columns[:recorder].label  = "更新者"
    config.columns[:created_at].label    = "作成日時"
    config.columns[:updated_at].label    = "更新日時"
    config.columns[:data].search_sql = 'data'

    config.list.columns << :recorder
    config.list.sorting = [{:data => :ASC}]

    config.show.columns << [:recorder,
                            :created_at,
                            :updated_at]

    config.search.columns << :data
  end

  protected
  def before_create_save(record)
    record[:recorder] = session[:login]
  end

  def before_update_save(record)
    record[:recorder] = session[:login]
  end
end

ポイントはcontroller内に定義した
before_create_save(record):新規登録用
before_update_save(record):更新処理用
を利用することです。

最初は、何も考えずにModelの
before_saveでsession情報を取ろうとしてしまったのですが、
session情報は、Modelでは取れないわけなのでした。
コメントを投稿