更新应用程序布局图标

时间:2016-03-22 17:56:53

标签: javascript ruby-on-rails ruby ajax

在我的应用程序控制器中,我有一个方法,用于在应用程序布局菜单上设置通知和通知图标。我用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但是单独这样就不会重新加载应用程序布局并更改图标了吗?

1 个答案:

答案 0 :(得分:1)

您的控制器代码在视图呈现之前运行完成,因此您可以执行在呈现阶段之前设置内容所需的任何操作。您可以在该阶段之前随意更改@icon_path之类的变量,最后一个值是使用的值。

如果您需要在HTML发送到浏览器后禁用视图中的图标,则需要使用JavaScript将其关闭。