在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发出(没有页面重新加载)。现在删除的对象(通知)将只显示在列表中。
我该如何解决这个问题?请帮帮我。
答案 0 :(得分:0)
您的问题是,您不能断定是否创建或删除了对象Notification
?
您可以使用after_create
和after_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();
}