通知機能にチャレンジしたけど、なぜか上手くいかない。
お知らせ通知
↑こんな感じで未読のお知らせがあったら、赤い点をつけるみたいなやつを、javascriptとか、helperファイルのアクションを使わずに実装する方法。
まだお知らせ機能自体を実装していない方は下記ののような分かりやすい記事を参考に実装しましょう!
- https://qiita.com/nekojoker/items/80448944ec9aaae48d0a
- https://qiita.com/yuto_1014/items/2db1dd4fcd7945b980f7
上記の記事でチャレンジしたけど、上手くいかない、、といった私と同じような問題を抱えている方へ向けて。
表示したいビューに紐づくコントローラーのアクションに変数を定義しておく
def index
@notification = Notification.all
end
notificationsテーブルの情報を取得.
[簡単]html.erbに記述を追加するだけ
<div class="alert-header">
<%= link_to notifications_path do %>
<span class="material-icons" id="alert">notification_important</span>
<% @notification.each do |notification| %>
<% if (notification.visited_id == current_user.id) && notification.checked == false %>
<span class="material-icons" id="on-alert">fiber_manual_record</span>
<% break %>
<% end %>
<% end %>
<% end %>
</div>
■解説
<% @notification.each do |notification| %>
コントローラーで定義した@notificationの変数をeachメソッドを用いて通知それぞれに対して処理が行われるようにする。
ブロック変数は今回notification
としたが何でもOK。
<% if (notification.visited_id == current_user.id) && notification.checked == false %>
<span class="material-icons">fiber_manual_record</span>
<% break %>
<% end %>
if条件式を用いて、visited_id
(コメントをされた側のユーザーのid)がcurrent_user.id
(現在ログインしているユーザーのid)、
尚且つ、notification_checked
(notificationsテーブルのcheckedカラム)の値がfalse(未読)であれば以下の処理をする、という記述。
break
としないと、通知の数だけ処理が繰り返されてしまうので注意。
以上。
何度やっても上手くいかなかったので、自分なりにアレンジしてみました。
備考
current_user.idはサインインしているユーザーを取得するためのgem 'devise'を導入した事で使えるようになるヘルパーメソッドですが、ログインしているユーザーのIDを取得できればOK。
マテリアルアイコンの導入は下記の記事を参考にどうぞ