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の小ネタのまとめ
0 件のコメント:
コメントを投稿