在我的应用程序控制器中,我有一个方法,用于在应用程序布局菜单上设置通知和通知图标。我用before_action运行这个方法:
def set_notifications
if user_signed_in?
@notifications = Notification.where(user_id: current_user.id)
@notifications.each do |n|
if n.read == false
return @icon_path = 'notification-alert-icon'
end
end
@icon_path = 'notification-icon'
end
end
当我有未读通知时,我得到了正确的通知图标,这样可以正常工作:
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"><%= image_tag(@icon_path) %></a>
<ul class="dropdown-menu">
<% if @notifications == 0 %>
<li class="text-center" style="color:white;">Você ainda não tem notificações</li>
<% else %>
<% @notifications.each do |n| %>
<li><%= link_to n.question.title, question_path(n.question), class: 'text-center' %></li>
<% end %>
<% end %>
<li role="separator" class="divider"></li>
<li><%= link_to 'Ver todas as notificações', "#" %></li>
</ul>
</li>
当用户点击通知图标,然后点击他收到通知的问题时,questions_controller会将该通知标记为已读(在show动作中):
notifications = Notification.where(question_id: question.id) if Notification.exists?(question_id: question.id)
if notifications
notifications.each do |notification|
if notification.user_id == current_user.id
notification.read = true
notification.save
end
end
end
我无法做到的是:在将通知标记为已读之后,如何更新应用程序布局上的@notifications对象和通知图标?我知道我可以调用方法set_notifications但是单独这样就不会重新加载应用程序布局并更改图标了吗?
答案 0 :(得分:1)
您的控制器代码在视图呈现之前运行完成,因此您可以执行在呈现阶段之前设置内容所需的任何操作。您可以在该阶段之前随意更改@icon_path
之类的变量,最后一个值是使用的值。
如果您需要在HTML发送到浏览器后禁用视图中的图标,则需要使用JavaScript将其关闭。