Rails 5 - 如何恢复/删除已经广播的通知?

时间:2018-03-22 06:25:12

标签: ruby-on-rails ruby notifications broadcast actioncable

在rails 5中,我正在使用ActionCable实时广播通知。一旦Notification对象被创建,就会发生广播。现在,我想在Notification对象被删除时恢复广播通知。

在notification_broadcast_job.rb中,

def perform(notification, user_id)
  ActionCable.server.broadcast "notifications:#{user_id}", data: NotificationSerializer.new(notification)
end

在notification.rb中,

after_commit :broadcast_notification

private

def broadcast_notification
  users.each do |user|
    NotificationsBroadcastJob.perform_later(self, user.id)
  end
end

现在的问题是,当用户A喜欢一个属于用户B的帖子时,B会收到通知(没有页面重新加载)。当用户A立即不喜欢它时,通知应该从用户B发出(没有页面重新加载)。现在删除的对象(通知)将只显示在列表中。

我该如何解决这个问题?请帮帮我。

1 个答案:

答案 0 :(得分:0)

您的问题是,您不能断定是否创建或删除了对象Notification

您可以使用after_createafter_destroy代替after_commit

后端将数据传递到前端,然后前端将显示或隐藏数据。关键是font-end需要知道是显示还是隐藏。所以后面和前面之间应该有一个协议。没有优雅的例子:

在notification.rb中,

after_create :broadcast_notification
after_destroy :delete_notification
private

def broadcast_notification
  users.each do |user|
    NotificationsBroadcastJob.perform_later(self,'created', user.id)
  end
end

def delete_notification
  users.each do |user|
    NotificationsBroadcastJob.perform_later(self,'delete', user.id)
  end
end

在notification_broadcast_job.rb中,

def perform(notification, message_type , user_id)
  ActionCable.server.broadcast "notifications:#{user_id}", data:{ message_type: message_type, info: {id: notification.id, body: notification.body}}
end

前端将首先阅读message_type。然后它知道显示或隐藏某些东西。

前端js代码:

if(data.message_type == 'created'){
  $('***').append('<li id=' + data.info.id + '>' + data.info.body +'</li>'); // 
}else{
  $('#'+ data.info.id).hide();
}