基本的にはこちらに書いてあるのですが、
github.com
少し詰まったとこもあったのでまとめ。
puclic_activityの概要
gemを通して追加したテーブルはactivitiesテーブルです。(デフォルトと一緒)
gemの説明にコンソールにて、gemのREAD.MEに書いてあるように、下記のコマンドを実行したので、
$ rails g public_activity:migration
$ rake db:migrate
すると、
下記のactivitiesテーブルが作成されています。
create_table "activities", force: :cascade do |t|
t.integer "trackable_id"
t.string "trackable_type"
t.integer "owner_id"
t.string "owner_type"
t.string "key"
t.text "parameters"
t.integer "recipient_id"
t.string "recipient_type"
t.datetime "created_at"
t.datetime "updated_at"
end
これでdbには枠ができたので、
次の章でmodelに使っている#trackedを使えば、ownerやrecipientに更新した人が誰なのかなど情報を追加できます。
Modelでの実装
例えば、Postモデルを例に上げると、下記のようなメソッドを追加して、「投稿の変更」が生成されるようにしています。
post.rbのmodelに追加。
更新された時はいいいのですが、削除の時、
物理削除されてしまうと、削除されたデータを参照できなくなってしまうので、
論理削除を扱うacts_as_paranoidのgemを入れて、
schemaに#deleted_atを付加することで、削除されたデータが何だったのかわかるように、別途migrationしました。
include PublicActivity::Model
tracked owner: proc { |controller, _model| controller.current_user }
tracked recipient: proc { |controller, _model| controller.current_xxx }
tracked xxx … と書くと、モデルが新規作成、更新、削除されたときにxxxにどういう値を入れるか決められます。
上記のように書くことによってactivitiesテーブルのデータには、
ownerにはモデルへの変更を行ったユーザーの情報が入るようにしています。(owner_idにuser_idが、owner_typeに"User"が)
recipientにも同様にデータ格納ができるので、例えば、変更を通知したいグループのidとかを入れておくこともできます。
ちなみに、trackableは対象のモデルデータが入るので、
Postモデルを対象としている場合は、post_idと"Post"がそれぞれtrackable_idとtrackable_typeに挿入されます。
Controllerでの実装
・#current_userを実装、helperとかに皆さん入れていることが多いでしょうかね。
更新(新規作成、更新、削除)を行ったユーザーが誰か特定して表示するために使用しています。
Viewでの更新の表示の実装
ロケールファイルに更新された時に出す文言を定義して、呼び出すことができます。
keyについてはcreateかupdateかdeleteかをデフォルトでgemが見てくれているので、
post.create
post.update
post.destroy
のどれかがkeyに含まれていることになります。
ロケールファイルに
activity:
post:
create: 投稿が作成されました
update: 投稿が更新されました
destroy: 投稿が削除されました
と記述して、
viewにて、= t("activity.#{activity.key}")
すれば、ymlで定義した最新の更新に使える文字情報を取得できます。
parametersというカラムも持っているので、
そこにより詳細な更新情報を持たせておけば、(新規作成、更新、削除した時に付加したい情報)
よりわかりやすい情報を個別に表示することが可能になります。
ロケールにパラメータを渡す設定をしておけば、より親切な文言を表示してあげることが可能です。
activity関連のspecを追加する時の実装
通常時ではspec_helperに記述したメソッドが有効になり、
activitiesが作成されないようになっています。
*上記のために、spec_helperに下記の記述をしてあげてください。
require 'public_activity'
require 'public_activity/testing'
PublicActivity.enabled = false
require ‘public_activity/testing'だけでspecは大丈夫ってgemに書いてあったけど、
'public_activity'しないと動いてくれなかったので書きました。
PublicActivity.with_tracking do
end
上記のように、with_trackingで囲んであげて、postやdeleteを行うようにspecを変更してあげてください。
PublicActivity.with_tracking do
expect do
post :create, ...
end.to change(PublicActivity::Activity, :count).by(1)
end
end