未读通知计数

时间:2014-08-22 04:03:57

标签: ruby-on-rails

我正在使用public_activity gem为用户创建通知列表。使用this post作为参考,我试图记录用户无法读取的通知。当用户点击查看他们拥有的通知时,我希望计数返回到零。上述问题的解决方案是创建一个类方法:

def self.unread
where(:read => false)
end

然后把它放在视图中:

user.notifications.unread.update_all(:read => true)

我的控制器看起来像这样:

def notifications
@activities = PublicActivity::Activity.order("created_at desc").where(recipient_id: current_user.id)
end

def self.unread
where(:read => false)
end

我的观点如下:

<% @activities.each do |activity| %>    
<%= render_activity activity %> 
<% end %>

我的问题是我在哪里添加:

.update_all(:read => true)
在视图中

,如何获取unread.count。

1 个答案:

答案 0 :(得分:5)

这很容易。您只需进行控制器操作,并在用户查看其通知时通过ajax调用它。

对于示例的动摇,我们假设将如何使用此gem实现facebook通知。

我将添加2个控制器方法

def notifications
   @activities = PublicActivity::Activity.order("created_at desc").where(recipient_id: current_user.id)
   @notification_count = @activities.where(:read => false).count  
end

def read_all_notification
   PublicActivity::Activity.where(recipient_id: current_user.id).update_all(:read => true)
end 

2条路线

get 'some_controller/notifications'
post 'some_controller/read_all_notification'

根据render_activity呈现的内容以及我们希望进一步隐藏此功能的位置,我们可以通过action调用相应的ajax。假设,我想要挂钩some_id作为id的功能。所以,我会这样做

$(document).on 'click' , '#some_id' , (e)->
    e.preventDefault()
    $.ajax '/some_controller/read_all_notification' ,
        type: "post"
        dataType: "json"
        beforeSend: (xhr) ->
          xhr.setRequestHeader "X-CSRF-Token", $("meta[name=\"csrf-token\"]").attr("content")
        cache: false

这一切。

值得一提的是,render_activity也提供了很少的其他选项,可以提供您想要渲染的完全灵活性howwhat

阅读此https://github.com/pokonski/public_activity/blob/master/lib/public_activity/renderable.rb#L16-L143

此方法是render_activity方法的核心。

多数民众赞成。