GitHub の News Feed みたいな機能を実装するのに、今まで TimelineFu を使っていたけど、GitHub のコミットログを見たら2年前から開発が滞っているみたい。
Rails 4 が出ても対応なんて望めそうもないので、Ruby Toolbox で TimelineFu の次に人気の PublicActivity を使ってみることにした。
PublicActivity をインストール
Gemfile に
gem "public_activity"
を追加し、
bundle
を実行してインストール。
データベースのセットアップ
アクティビティを保存するテーブルが必要なので、
rails generate public_activity:migration
でマイグレーションファイルを生成。
あとは
rake db:migrate
で PublicActivity が使うテーブルを作成。
モデルのアクティビティを追跡できるようにする
アクティビティを追跡したいモデルを修正する。
その際、DB に保存するアクティビティと、ログインユーザーを結びつけるようにしておく。
class Entry < ActiveRecord::Base include PublicActivity::Model tracked :owner => proc{ |controller, model| controller.current_user|} end
デフォルトでは create, update, delete のアクティビティが保存される。
あと、ApplicationController を次のように修正しておかないと、tracked に渡した proc 内で、コントローラーの current_user にアクセスできないので注意。
class ApplicationController < ActionController::Base protect_from_forgery # Necessary include if you plan on access controller instance # in Procs passed to #tracked method in your models include PublicActivity::StoreController include ActionView::Helpers::TextHelper end
アクティビティを表示
まず、コントローラーで Activity を取得する。
def index @activities = PublicActivity::Activity.order("created_at DESC"). where(:owner_type => "User", :owner_id => current_user) end
そしてビューに出力。render_activity というヘルパーメソッドが提供されているので、それを使う。
<% @activities.each do |activity| %> <div> <%= render_activity(activity) %> </div> <% end %>
ロケールファイルに activity 用の文字列を書いておかないと正しく表示されないので、ひとまず config/locals/en.yml に下記を追加する。
en: activity: entry: create: 'Entry has been created' update: 'Someone has edited the entry' destroy: 'Some user removed an entry!'
サーバーを起動し、Web ブラウザを操作してデータを数件登録した後、アクティビティの一覧を表示できたんで一段落。