Можно ли использовать драгоценный камень непрочитанным с общественным активом?
В настоящее время я использую гем "Публичная активность", и в представлении у меня отфильтровано действие пользователей, чтобы показывать только тому пользователю действия, которые к ним относятся, например, "Джон Смит прокомментировал ваше сообщение". Тем не менее, я хотел бы добавить уведомления к этому, например, Facebook или Twitter, где значок показывает номер, и когда вы видите канал, значок исчезает.
Я нашел драгоценный камень под названием Unread, который выглядит идеально, за исключением того, что требует добавления acts_as_readable :on => :created_at
к вашей модели, и, поскольку я использую гем public_activity, класс не доступен для добавления этого.
Можно ли вставить код, который требуется непрочитанному гему, в класс PublicActivity:Activity?
Ссылки:
драгоценный камень public_activity: https://github.com/pokonski/public_activity
камень непрочитанный: https://github.com/ledermann/unread
2 ответа
Для тех, кто может найти это в будущем, я реализовал совершенно другую систему, моделируя свои собственные уведомления. Вместо того, чтобы использовать публичную активность и непрочитанные, я создал новую модель под названием уведомления. Это было столбцы:
recipient:integer
sender:integer
post_id:integer
type:string
read:boolean
Затем, всякий раз, когда у меня был пользовательский комментарий или что-то подобное, я строил новое уведомление в контроллере, передавая следующую информацию:
recipient = @post.user.id
sender = current_user.id
post_id = @post.id
type = "comment" # like, or comment etc
read = false # read is false by default
В панели навигации я просто добавил значок, который подсчитывал непрочитанные уведомления current_users, основываясь на переменной контроллера приложения.
@unreadnotifications = current_user.notifications.where(read: false)
<% if @unreadnotifications.count != 0 %>
(<%= @unreadnotifications.count %>)
<% end %>
Затем в контроллере уведомлений у меня было запустить mark_as_read
действие на вид. Затем установите счетчик уведомлений обратно на 0.
before_action :mark_as_read
def mark_as_read
@unread = current_user.notifications.where(read: false)
@unread.each do |unread|
unread.update_attribute(:read, true)
end
end
На самом деле можно добавить дополнительные вещи к PublicActivity::Class
как это:
Добавить этот файл под названием public_activity.rb
в config/initializers
,
PublicActivity::Activity.class_eval do
acts_as_readable :on => :created_at
def self.policy_class
ActivityPolicy
end
end
Я также включил туда фрагмент для любого, кто использует Pundit с Public Activity, чтобы вы могли просто иметь activity_policy.rb
файл политики.
ПРИМЕЧАНИЕ. Обязательно используйте последнюю версию Public Activity, включающую эту строку: https://github.com/chaps-io/public_activity/blob/1-5-stable/lib/public_activity/orm/active_record/activity.rb#L9 потому что без base_class
установить, непрочитанный будет использовать неправильное полиморфное имя класса.