activerecord-reputation-system というユーザー評価に使用できるgemを導入して、以下のようにお気に入りする機能を実装しました。
Ruby
1class Shop < ActiveRecord::Base 2 has_one :post, dependent: :destroy, foreign_key: 'id',autosave: true 3 has_reputation :likes, source: {reputation: :likes, of: :post}, aggregated_by: :sum 4end 5 6class Post < ActiveRecord::Base 7 belongs_to :shop, foreign_key: "id", autosave: true 8 has_reputation :likes, source: :user, aggregated_by: :sum 9end 10 11class User < ActiveRecord::Base 12 has_many :evaluations, class_name: "ReputationSystem::Evaluation", as: :source 13 14 def liked?(post) 15 evaluations.where(target_type: post.class, reputation_name: :likes, target_id: post.id).present? 16 end 17 18end
Ruby
1class PostsController < ApplicationController 2 before_action :authenticate_user!, only: :like 3 4 def like 5 @post = Post.find(params[:id]) 6 if params[:type] == "up" 7 value = 1 8 @post.add_or_update_evaluation(:likes, value, current_user ) 9 redirect_to :back, notice: 'お気に入りに追加しました' 10 else 11 @post.delete_evaluation(:likes,current_user) 12 redirect_to :back, notice: 'お気に入りから外しました' 13 end 14 end 15 16end
user は、shopが投稿したpostにお気に入り出来る、という機能です。
実際に上記の記述でお気に入り自体は正常に動作しています。
しかし、次に実装したい機能の実装方法がわかりません。
1.Postがお気に入りに追加された場合、そのPostの親Shopの管理画面にお気に入りにされた旨の通知を飛ばす。(画面内での表示)
2.Userは自分がお気に入りに追加したPost一覧表示できる
1.については、likeメソッドに何らかのアクションを入れることで通知できそうな気がするのですが、具体的な実装方法がわからずに困っています。
2.については、一覧画面を表示するメソッド内でcurrent_userにお気に入りされたpostの集まりである@postsをうまく取得できればいいかと思うのですが、その記述方法がわからずに困っています。
長くなってしまうかもしれませんが、
できるだけ具体的にご教示いただければ助かりますm(__)m
よろしくお願いいたします。
追記
2については、以下の様な記述で実装が出来ました。
Ruby
1class UserController < ApplicationController 2 def like_show 3 @posts = Post.evaluated_by(:likes, current_user) 4 end 5end 6
1.についてはまだわからないので、是非ご教示いただきたいです。
よろしくお願いいたします。
追記
曖昧な質問で申し訳ありませんでした。
お気に入りに追加されたShopがログインしていた場合に、画面上部などに通知アイコンを表示し、そこをクリックすると通知情報が出るようにしたいです。
出来ればリアル・タイムでプッシュ通知のように、ページをリロードしなくても通知が届くとベストです。
また、通知があった場合に、その内容をAction Mailerを使ってShopのアドレスにメールが届くようにしたいです。
その際に、通知でメールが届く設定にするかどうかをShopが選べるようにも実装したと考えています。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー