ActiveRecord Reputation System で「いいね!」機能を導入する

色んなソーシャルサイトに実装してある「いいね!」ボタンの機能。仕組みは分かるので一から実装もできるとは思うのですけど、activerecord-reputation-system という gem を見つけたのでそれを使ってみました。

ActiveRecord Reputation System

スポンサーリンク

activerecord-reputation-system をインストール

Gemfile

続いて以下の手順を実行。

のはずが、generate でいきなりエラー。

activerecord-reputation-system が Rails3 までの attr_accessible を使用しているらしく、Rails4 で利用する場合は strong_parameters を使ってねとメッセージが出ています。

ということで、調べたら Rails4 の strong_parameters に対応した activerecord-reputation-system があったので、そちらを利用するように Gemfile を変更。

Gemfile

bundle install からやりなおし。

これで、インストールができマイグレーションも完了。

「いいね!」が付けられる対象のモデルに has_reputation を追加

ここではユーザーの投稿文 Post モデルがユーザー(User モデル)によって「いいね」されるという例を考えます。「いいね!」されるモデル(Post モデル)に以下のコードを追加する。

:likes は評価の名前、ここは任意でなんでも良い。source には Post を「いいね」するモデル名を指定、ここでは User が Post を「いいね」するので :user を指定。.aggreated_by は、評価の方法を指定します。ここでは、単純に :sum(合計値)を指定。

驚きですが、たったこれだけで最低限の「いいね」機能が動作します。

activerecord-reputation-system の動作を pry で確認

以降、Rails 環境の pry で「いいね」機能の動作を試しました。出力されたSQLは省略してます。

pry で「いいね!」システムの基本が動作するのを確認できました。

この部分が、user1 が post に「いいね」する動作です。add_evaluation メソッドは…

評価されるモデルのオブジェクト.add_evaluation(評価の名前, 評価で足す数字, 評価するモデルのオブジェクト)

となる。今回の例では「いいね!」機能が目的なので、単純に 1 を足しました。メソッド詳細は以下など参考。

https://github.com/twitter/activerecord-reputation-system/wiki/Evaluate-Models

で、post が持つ「いいね」された数を取得できます。float で返ってくるので to_i。

また、一人目のユーザー(user1)が、同じ post に2回目のいいねをしようとしたら、バリデーションエラーが起こり重複いいねが避けられているのを確認できます。

user2 がいいねした後に、post の「いいね数」を post.reputation_for(:likes).to_i で取得すると、ちゃんと 2 に増えているのも確認しました。

素晴らしく簡単、今回は一応ここまでの導入と動作確認で終了です。コントローラーに like, unlike メソッドなどを作成したら、またブログにアップしようと思います。コントローラーを作るより、HTML と jQuery で「いいね!」ボタンのインターフェースを作るほうが大変そうな感触です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!