我正在使用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。
答案 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
也提供了很少的其他选项,可以提供您想要渲染的完全灵活性how
和what
。
阅读此https://github.com/pokonski/public_activity/blob/master/lib/public_activity/renderable.rb#L16-L143
此方法是render_activity
方法的核心。
多数民众赞成。