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 件のコメント:
コメントを投稿