2012-10-01

ActiveScaffoldでpaper_trailの履歴情報を表示する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveRecordの履歴情報には、
paper_trail
がよさげと先日ご紹介させていただきました。
ActiveRecordの変更履歴を保存するにはpaper_trailがよさげ


そのpaper_trailで保存された履歴情報をActiveScaffoldで表示する方法です。

Blogモデルで履歴情報を残すようにして、Blogモデル用のActiveScaffoldで履歴情報をネストして表示できるようにする例です。

ActiveScaffoldでnestを利用するには、has_manyで関係が明示されていないとダメっぽいので
まずはBlogモデルの履歴表示用のBlogVersionというモデルを作ります。
以下のような感じです。

# -*- encoding: utf-8 -*-
class BlogVersion < Version
  def method_missing(action)
    unless self.reify.attributes.keys.index(action.to_s).nil?
      self.reify[action]
    else
      super
    end
  end
end

paper_trailにより作成されたVersionモデルを継承します。
そしてmethod_missing内でBlogモデルが持つattributeと同じものを利用できるようにします。
厳密にはidとcreated_atだけはVersionのものになってしまいます。

そしてBlogモデルで以下のようにします。

# -*- encoding: utf-8 -*-
class Blog < ActiveRecord::Base
  has_many   :blog_versions, :foreign_key => "item_id"
end

versionsテーブルでblogsのidを保持するのはitem_idになるのでforeign_keyに指定します。


コントローラー側です。
まずは、BlogVersion用のものです。

class BlogVersionController < ApplicationController
  active_scaffold :blog_versions do |config|
    config.label = "変更履歴"
    config.actions.exclude :create, :update, :delete, :search
    config.columns = [:entry,
                      :auther,
                      :updated_at]
  end
end

新規追加、変更、削除はできないようにしておきます。
そして表示するカラムは明示します。

Blog用のものは以下のような感じです。

# -*- encoding: utf-8 -*-
class BlogController < ApplicationController
  active_scaffold :blogs do |config|
    config.label = "ブログエントリ"
    config.columns = [:entry,
                      :auther,
                      :created_at,
                      :updated_at]
    config.nested.add_link(:blog_versions, :label => '変更履歴')
  end
end

ここのnestedでblog_versionsを指定することで各ブログエントリ毎の変更履歴を表示することができるようになります。



ちなみに、このブログでactive_scaffoldに関しての情報を他にも乗せています。
ActiveScaffoldの小ネタのまとめ

コメントを投稿