web-dev-qa-db-fra.com

Comment créer un système de notification dans les rails?

Fondamentalement, je veux créer une notification comme Facebook et Stackoverflow. Plus précisément, dans un système de post-commentaires, lorsqu'un post est commenté, toutes les personnes impliquées (les personnes qui créent le post et qui créent des commentaires, à l'exception du nouveau commentateur) reçoivent un message de notification indiquant que ce post est commenté. Et la notification est rejetée lorsque les gens l'ont lue.

J'ai essayé d'utiliser boîte aux lettres gem pour l'implémenter, mais malheureusement, aucun exemple n'est disponible en utilisant ses méthodes connexes, y compris social_stream lui-même.

Existe-t-il un autre moyen de créer le système de notification?

Et lorsque j'essaie de le créer à partir de zéro, j'ai plusieurs problèmes:

    Model Notification
    topic_id: integer
    user_id: integer
    checked: boolean #so we can tell whether the notification is read or not
  1. Rejeter la notification après avoir été lu par les utilisateurs

Je pense que nous devons juste transformer l'attribut "vérifié" de chaque message de notification en vrai après que l'utilisateur a visité l'index de notification. (Dans NotificationsController)

    def index
      @notifications=current_user.notication.all
      @notification.each do |notification|
         notification.checked = true
      end
      @notification.save!
    end

2.Sélectionner les utilisateurs à notifier (et exclure l'utilisateur qui fait un nouveau commentaire)

Je n'ai juste aucune idée dans la rédaction de requêtes ....

3.Création de notifications

Je pense que cela devrait être quelque chose comme

    #in CommentController
    def create
      #after creating comments, creat notifications
      @users.each do |user|
        Notification.create(topic_id:@topic, user_id: user.id)
      end
    end

Mais je pense que c'est vraiment moche

Il n'est pas nécessaire de répondre aux 3 problèmes ci-dessus, toute solution simple au système de notification est préférable, merci ....

27
cqcn1991

Je pense que vous êtes sur la bonne voie.

Un index des notifications légèrement meilleur

def index
  @notifications = current_user.notications
  @notifications.update_all checked: true
end
  1. Avertissez cet utilisateur

    User.uniq.joins(:comments).where(comments: {id: @comment.post.comment_ids}).reject {|user| user == current_user }
    

Les utilisateurs uniques qui ont participé aux commentaires du post @ comment, rejettent (suppriment du résultat) current_user.

  1. Un observateur comme l'a souligné João Daniel, il est préférable à un after_create. Cette "meilleure pratique Rails" le décrit assez bien: http://Rails-bestpractices.com/posts/2010/07/24/use-observer
13
Leonel Galán

il y a un joyau incroyable appelé activité publique, vous pouvez le personnaliser comme vous le souhaitez et voici un screencast à ce sujet dans railscast http://railscasts.com/episodes/406-public-activity espérons que pourrait vous aider.

Mettre à jour

Dans mon Rails, j'ai créé un système de notifications similaire au vôtre pour envoyer des notifications à tous les utilisateurs, mais en action d'indexation, vous pouvez utiliser

current_user.notifications.update_all(:checked=>true)

et aussi pour envoyer une seule notification à l'utilisateur une fois pas plusieurs fois que quelqu'un a commenté le message, vous pouvez utiliser la méthode unique_by

  @comments [email protected]_by {|a| a[:user_id]}

alors vous pouvez envoyer des notifications uniquement aux utilisateurs des commentaires précédents

 @comments.each do |comment|
 comment.user.notifications.create!(....
 end 

j'espère que cela pourrait vous aider

9
Remon Amin