PublicActivity を使って GitHub の News Feed みたいな機能を実装したメモ

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 ブラウザを操作してデータを数件登録した後、アクティビティの一覧を表示できたんで一段落。

f:id:griefworker:20130124205215p:plain