Rails3×MagicUserstampでcreator_id、updater_idを追加する

MagicUserstampは(id:akm)さんが作ったプラグインで、
creator_id, updater_id, deleter_id (acts_as_paranoidと併用時)を自動で追加してくれます。


詳細は、(id:akm:20091028:1256731307)
または、akm/magic_userstamp · GitHubを見てください。


今回はRails3でMagicUserstampを使ってみました。忘れないようにメモっておきます。
Authlogicプラグインを既にインストールしていることを前提にしています。

binarylogic/authlogic · GitHub


以下、akm/magic_userstamp · GitHubのREADMEを参考にMagicUserstampをインストールしていきます。


Gemfile

gem 'magic_userstamp'

Gemfileに上記1行を追加します。

$ bundle install

gemをインストールします。


db/migrate/20100907084640_add_column_magic_userstamp_ids_to_all_tables.rb

class AddColumnMagicUserstampIdsToAllTables < ActiveRecord::Migration
  def self.up
    add_column :bukkens, :creator_id, :integer
    add_column :bukkens, :updater_id, :integer
  end

  def self.down
    remove_column :bukkens, :creator_id
    remove_column :bukkens, :updater_id
  end
end

モデルにMagicUserstampが使うカラムを追加します。
※モデルは既にあったので、カラムを追加するマイグレーションを作成しました。
※deleter_idは使用しませんでした。

$ rake db:migrate

マイグレーションを実行して、テーブルにカラムを追加します。


config/initializers/magic_userstamp.rb

require 'magic_userstamp'
# Comment out if you don't use t.userstamp at all in migrations
ActiveRecord::ConnectionAdapters::TableDefinition.send(:include, MagicUserstamp::MigrationHelper)
ActiveRecord::Base.module_eval do
  include MagicUserstamp
end

MagicUserstamp.config.setup do |config|
  # config.verbose = true
  # config.verbose = {:classes => [:Version]}
  config.defaults(:stamper_class_name => 'User')
end

# If you have some classes which has loaded before Userstamp is loaded,
# Set record_userstamp = true
# Example: vestal_versions gem
# Version.record_userstamp = true if defined?(Version)

設定ファイルを新規作成します。


app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  helper :all

  before_filter :set_user
  after_filter :reset_user

  private

  #
  # = Magic Userstampで使用するメソッド =
  #

  def set_user
    user_id = current_user.id if current_user # ここではIDが帰ってくるはず。
    User.model_stamper        # UserがIDを覚えられるようにする。
    User.stamper = user_id    # IDを覚えておく。stamper=にはオブジェクトを渡してもOK。
  end

  def reset_user
    User.model_stamper  # Userが覚えているIDを忘れることができるようにする。
    User.reset_stamper  # Userが覚えているIDを実際に忘れる。
 end
end

ApplicationControllerに必要なメソッドとフィルターを追加します。


app/models/bukken.rb

class Bukken < ActiveRecord::Base
  MagicUserstamp.config.compatibles
end

最後にモデルに一行追加すれば、OKです。


これで新規作成時にcreator_id、更新時にupdater_idが自動で登録されるようになりますw