2015-09-22 13 views
5

Jeśli napiszę komentarz dotyczący Twojego statusu, a następnie skomentujesz z powrotem, nie otrzymam powiadomienia z informacją, że skomentowałeś.Jak powiadomić komentującego?

Obecnie tylko właściciel statusu otrzymuje powiadomienia. Jak możemy zrobić, skąd każdy, kto skomentował status, również powinien otrzymać powiadomienie?

Modele

class Comment < ActiveRecord::Base 
    after_save :create_notification 
    has_many :notifications 
    def create_notification 
    author = valuation.user 
    notifications.create(
     comment:  self, 
     valuation: valuation, 
     user:   author,  
     read:   false 
    ) 
    end 
end 

class Notification < ActiveRecord::Base 
    belongs_to :comment 
    belongs_to :valuation 
    belongs_to :user 
end 

class Valuation < ActiveRecord::Base 
    belongs_to :user 
    has_many :notifications 
    has_many :comments 
end 

kontrolery

class CommentsController < ApplicationController 
    before_action :set_commentable, only: [:index, :new, :create] 
    before_action :set_comment, only: [:edit, :update, :destroy] 

    def create 
    @comment = @commentable.comments.new(comment_params) 
    if @comment.save 
     redirect_to @commentable, notice: "Comment created." 
    else 
     render :new 
    end 
    end 

    private 

    def set_commentable 
    @commentable = find_commentable 
    end 

    def set_comment 
    @comment = current_user.comments.find(params[:id]) 
    end 

    def find_commentable 
    if params[:goal_id] 
     Goal.find(params[:goal_id]) 
    elsif params[:habit_id] 
     Habit.find(params[:habit_id]) 
    elsif params[:valuation_id] 
     Valuation.find(params[:valuation_id]) 
    elsif params[:stat_id] 
     Stat.find(params[:stat_id]) 
    end 
    end 
end 

class NotificationsController < ApplicationController 
    def index 
    @notifications = current_user.notifications 
    @notifications.each do |notification| 
     notification.update_attribute(:read, true) 
    end 
    end 
end 

widoki

#notifications/_notification.html.erb 
commented on <%= link_to "your value", notification_valuation_path(notification, notification.valuation_id) %> 

#comments/_form.html.erb 
<%= form_for [@commentable, @comment] do |f| %> 
    <%= f.text_area :content %> 
<% end %> 
+3

Twoje pytanie jest zbyt ogólne. _ "za każdym razem, gdy użytkownik komentuje status, każdy komentarz, który pojawi się po tym statusie **, powinien powiadomić użytkownika ** o tym, że został dodany dodatkowy komentarz" _. Co chcesz wiedzieć? Czy pytasz o to, w jaki sposób wiedzieć _when_, aby powiadomić, czy pytasz o _how_, aby powiadomić użytkownika? Co dokładnie masz na myśli przez _notifying_? Niektóre wartości zmieniły się w modelu, wysłano wiadomość e-mail, wyskakujące okienko ... – brito

+0

Jeśli skomentuję Twoją wartość. Następnie, jeśli skomentujesz ponownie tę wartość. Nie dostałem powiadomienia z informacją, że skomentowałeś. Tylko osoba, której wartość ma, otrzyma powiadomienie. Być może istnieje sposób w 'def create_notification' do wykonania tej pracy @brito –

+0

@ AnthonyGalli.com Tak, ponieważ Powiadomienie jest zawsze tworzone z' user: author, 'i' author = valuation.user' (jest to wewnątrz ' create_notification'). Musisz więc utworzyć to konkretne powiadomienie, przekazując autorowi komentarza 'Comment' zamiast autora' Valuation'. – brito

Odpowiedz

4

zamiast tworzyć jedno zgłoszenie w dla autora, należy pobrać listę użytkowników, którzy skomentowali wycenę. Nie widzę modelu belongs_to :user w modelu komentarza Comment, ale zakładam, że taki jest, ponieważ jesteś w stanie wykonać current_user.comments w CommentsController.

Dodajmy has_many relację w Valuation aby pobrać wszystkie komentatorów dla danej wyceny:

class Valuation < ActiveRecord::Base 
    belongs_to :user 
    has_many :notifications 
    has_many :comments 
    has_many :commentators, -> { distinct }, through: :comments, source: :user 
end 

Jeśli używasz wersji Rails < 4, należy wymienić -> { distinct } przez uniq: true

Następnie , możesz po prostu użyć tej nowej relacji, aby utworzyć powiadomienia dla wszystkich komentatorów w modelu Comment:

class Comment < ActiveRecord::Base 
    after_save :create_notification 
    belongs_to :user 
    belongs_to :valuation 
    has_many :notifications 

    def create_notification 
    to_notify = [valuation.user] + valuation.commentators 
    to_notify = to_notify.uniq 
    to_notify.delete(user) # Do not send notification to current user 
    to_notify.each do |notification_user| 
     notifications.create(
     comment:  self, 
     valuation: valuation, 
     user:   notification_user,  
     read:   false 
    ) 
    end 
    end 
end 
Powiązane problemy