社会人から始めたプログラミング

プログラミング、エンジニアに関することでの備忘録、シェアしたい情報などを共有するためのブログです。

Public Activityのgemをつかってみた(誰かがデータ更新して変更したとかしないとかを表示するために使える)

基本的にはこちらに書いてあるのですが、

github.com

少し詰まったとこもあったのでまとめ。

puclic_activityの概要 gemを通して追加したテーブルはactivitiesテーブルです。(デフォルトと一緒) gemの説明にコンソールにて、gemのREAD.MEに書いてあるように、下記のコマンドを実行したので、

$ rails g public_activity:migration
$ rake db:migrate

すると、 下記のactivitiesテーブルが作成されています。

# schema.rb
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 # gemから必要なメソッドを呼び出すために必要なinclude
tracked owner: proc { |controller, _model| controller.current_user } # postに変更があった時にユーザーのidをactivitesテーブルに入れるためのメソッド
tracked recipient: proc { |controller, _model| controller.current_xxx } # postに変更があった時に他に情報をつかたいときにどうぞ。

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
  # your test code goes here
end

上記のように、with_trackingで囲んであげて、postやdeleteを行うようにspecを変更してあげてください。

PublicActivity.with_tracking do
  expect do
    post :create, ...
      
    end.to change(PublicActivity::Activity, :count).by(1)
  end
end