2016-03-22 6 views
1

アプリケーションコントローラには、アプリケーションレイアウトメニューの通知と通知アイコンを設定するためのメソッドがあります。アプリケーションレイアウトアイコンの更新

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 

私は未読の通知を持っているとき、私は正しい通知アイコンを取得するように、これは正常に動作します:私はbefore_actionでこのメソッドを実行

<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 

私は何をすることができていないことである:どのように私は更新されます@通知を通知としてマークした後、アプリケーションレイアウト上の通知オブジェクトと通知アイコンをクリックしますか?私はメソッドset_notificationsを呼び出すことができますが、それだけでアプリケーションのレイアウトをリロードせずにアイコンを変更することはできません。

答えて

1

ビューがレンダリングされる前にコントローラコードが完了して実行されるため、レンダリングフェーズの前に設定した内容を得るために必要なことはすべて実行できます。その段階の前に任意の回数だけ@icon_pathのような変数を自由に変更できます。最後に設定された値が使用されます。

HTMLがブラウザに送信された後で、アイコンをビューで無効にする必要がある場合は、JavaScriptを使用してそれをオフにする必要があります。

+0

私に答える時間をとってくれてありがとう!最初にページにアクセスすると、アプリケーションコントローラが実行され、アプリケーションのレイアウトが正しくレンダリングされますか?リンクをクリックして別のコントローラ/アクションに行くと、アプリケーションコントローラが再び実行され、アプリケーションレイアウトが再びレンダリングされるというわけではありません。私はリンクをクリックし、レールはquestions_controller#showを実行すると、前にロードされたアプリケーションレイアウト内でshow.html.erbだけでなくアプリケーションレイアウトを含むレイアウト全体を再ロードすることは可能ですか?それとも、jsを使う必要があるということですか? – Rob

+1

Railsのデフォルトの動作は、一般的にHTTPのような要求/応答です。 'セッション '、データベース、またはディスク上のファイルに残っているもの以外に、Rails側の状態は保持されません。各ページのリクエストは、新しいコントローラインスタンスと、インスタンス変数まできれいなスレートから始まります。 「レイアウトをリロードする」とはどういう意味ですか?各ページリクエストは毎回ゼロから実行されます。 – tadman

+0

それで、もし私がリンクをクリックすると、<%= link_to 'question'、question_path(question)%>、 があると、レールはアプリケーションコントローラの新しいインスタンスと質問コントローラの新しいインスタンスを実行しますか? – Rob

関連する問題