Machen wir es mit Bezug auf diesen Artikel!
ruby
rails g model Notification visitor_id:integer visited_id:integer room_id:integer message_id:integer action:string checked:boolean
Zuordnung zwischen Benutzermodell und Benachrichtigungsmodell
app/models/user.rb
has_many :active_notifications, class_name: 'Notification', foreign_key: 'visitor_id', dependent: :destroy
has_many :passive_notifications, class_name: 'Notification', foreign_key: 'visited_id', dependent: :destroy
Assoziation von Raummodell und Benachrichtigungsmodell
app/models/room.rb
has_many :notifications, dependent: :destroy
Zuordnung von Nachrichtenmodell und Benachrichtigungsmodell
app/models/message.rb
has_many :notifications, dependent: :destroy
Zuordnung des Benachrichtigungsmodells zum Benutzer-, Raum- und Nachrichtenmodell
app/models/notification.rb
default_scope -> { order(created_at: :desc) }
belongs_to :room, optional: true
belongs_to :message, optional: true
belongs_to :visitor, class_name: 'User', foreign_key: 'visitor_id', optional: true
belongs_to :visited, class_name: 'User', foreign_key: 'visited_id', optional: true
messages_controller.rb
class MessagesController < ApplicationController
def create
if Entry.where(user_id: current_user.id, room_id: params[:message][:room_id]).present?
@message = Message.new(message_params)
#von hier
@[email protected]
#Addiere hier
if @message.save
#von hier
@roommembernotme=Entry.where(room_id: @room.id).where.not(user_id: current_user.id)
@[email protected]_by(room_id: @room.id)
notification = current_user.active_notifications.new(
room_id: @room.id,
message_id: @message.id,
visited_id: @theid.user_id,
visitor_id: current_user.id,
action: 'dm'
)
#Wenn es sich um einen Kommentar zu Ihrem Beitrag handelt, wird er benachrichtigt
if notification.visitor_id == notification.visited_id
notification.checked = true
end
notification.save if notification.valid?
#Addiere hier
redirect_to "/rooms/#{@message.room_id}"
end
else
redirect_back(fallback_location: root_path)
end
end
private
def message_params
params.require(:message).permit(:user_id, :body, :room_id).merge(user_id: current_user.id)
end
end
terminal
rails g controller notifications index
controller/notifications_controller.rb
class NotificationsController < ApplicationController
def index
@notifications = current_user.passive_notifications
end
end
erb:views/notifications/index.html.erb
<% notifications = @notifications.where.not(visitor_id: current_user.id) %>
<% if notifications.exists? %>
<%= render notifications %>
<% else %>
<p>Es erfolgt keine Benachrichtigung</p>
<% end %>
erb:views/notifications/_notificastion.html.erb
<% visitor = notification.visitor %>
<% visited = notification.visited %>
<div>
<%= link_to user_path(visitor) do %>
<%= visitor.name %>Ist
<% end %>
<% if notification.action=='dm' %>
Ich habe dir eine DM geschickt
<% end %>
</div>
1: Beurteilen Sie anhand der von Ihnen gesendeten Nachricht, ob es sich um eine von der anderen Partei gesendete Nachricht handelt 2: Wenden Sie ein anderes CSS auf die von Ihnen gesendete Nachricht und die von der anderen Partei gesendete Nachricht an
Es scheint, dass es in diesen 2 Schritten implementiert werden kann! Der Punkt ist Schritt 1.
Wie urteilst du? Das ist es. In der Nachrichtentabelle sollte sich eine Spalte user_id befinden, aus der die Nachrichtenfunktion besteht. (Bereits vorhanden, um festzustellen, wer es gepostet hat) Anhand des dort eingegebenen Werts können Sie anhand der von Ihnen gesendeten Nachricht beurteilen, ob es sich um eine von der anderen Partei gesendete Nachricht handelt. Probieren wir es also im nächsten Kapitel aus!
erb:rooms/show.html.erb
<% @messages.each do |m| %> <%#Bitte ändern Sie die Instanzvariablen hier in Ihre eigenen Instanzvariablen!%>
<% if m.user_id == current_user.id %>
<div class="current_user">
<strong class="current_user"><%= m.body %></strong>
<small class="current_user"><%= m.user.name %>Herr.</small>
</div>
<% else %>
<div class="visited_user">
<strong class="visited_user"><%= m.body %></strong>
<small class="visited_user"><%= m.user.name %>Herr.</small>
</div>
<% end %>
<% end %>
Wissen Sie, was Sie oben tun? !! Wenn der Wert von user_id die ID des angemeldeten Benutzers ist, geben Sie die Klasse current_user in das Meldungsfeld (div) ein. Wenn der Wert von user_id die ID des anderen Benutzers ist (genau genommen ist die ID nicht der angemeldete Benutzer), geben Sie die Klasse visit_user in das Meldungsfeld (div) ein. Wir haben es gegeben!
CSS-Beispiel)
css
.current_user {
color: red;
text-align: right;
background-color: #fff;
width: fit-content;
margin: 10px 0 0 auto;
border-radius: 30px;
-webkit-border-radius: 30px;
-moz-border-radius: 30px;
-ms-border-radius: 30px;
-o-border-radius: 30px;
box-sizing: border-box;
padding: 10px;
}
.visited_user {
color: #fff;
margin: 10px;
background-color: brown;
text-align: left;
width: fit-content;
margin: 10px auto 0 0;
border-radius:30px;
-webkit-border-radius:30px;
-moz-border-radius:30px;
-ms-border-radius:30px;
-o-border-radius:30px;
box-sizing: border-box;
padding: 10px;
}
Annahme: Die Benachrichtigungsfunktion ist im Benachrichtigungsmodell implementiert Die Spalten umfassen ID, Besucher-ID, Besuchte-ID, Raum-ID, Nachrichten-ID, Aktion, Aktiviert, Erstellt_at, Aktualisiert_at Geplant zum Verwalten von Lese- und Lesevorgängen in aktivierten Spalten (Boolescher Typ)
1: Nur ungelesene Benachrichtigungen anzeigen (dh nur anzeigen, wenn die aktivierte Spalte falsch ist) 2: Anfangs standardmäßig ungelesen 3: Wenn Sie auf den Link "Als gelesen markieren" klicken, können Sie die markierte Spalte auf "true" setzen, damit sie gelesen wird.
Wenn Sie die obigen Schritte ausführen, können Sie es implementieren!
erb:_notification.html.erb
<% if notification.checked == false %> <%#← Diese eine Zeile ist wichtig%>
<div>
<%= link_to room_path(@roomId) do %>
<%= visitor.name %>Herr.
<% end %>
<% if notification.action=='dm' %>
Bist du(<%= visited.name %>Herr.)DM gesendet an
<% end %>
<%= link_to 'als gelesen markieren',notification_path(notification.id),method: :put %>
</div>
<% end %> <%#← Diese eine Zeile ist wichtig%>
Da die markierte Spalte zunächst auf false gesetzt ist, ändern Sie sie nicht!
rb:_notification.html.erb
class NotificationsController < ApplicationController
def index
@notifications = current_user.passive_notifications
#↓ Wenn Sie etwas darunter geschrieben haben, insbesondere wenn Sie einen Prozess schreiben, der check true macht, löschen Sie diese Beschreibung!
end
end
erb:_notification.html.erb
<% if notification.checked == false %>
<div>
<%= link_to room_path(@roomId) do %>
<%= visitor.name %>Herr.
<% end %>
<% if notification.action=='dm' %>
Bist du(<%= visited.name %>Herr.)DM gesendet an
<% end %>
<%= link_to 'als gelesen markieren',notification_path(notification.id),method: :put %>
<%#↑ Diese eine Zeile! !!%>
</div>
<% end %>
Rufen Sie die Aktualisierungsaktion des Benachrichtigungscontrollers auf, wenn Sie auf "Als gelesen markieren" klicken. Zu diesem Zeitpunkt wird die ID der Benachrichtigungstabelle als Argument als Parameter verwendet.
notification_controller
class NotificationsController < ApplicationController
#Kürzung
def update
notification=Notification.find(params[:id]) #...①
if notification.update(checked: true) #...②
redirect_to action: :index
end
end
end
Dann wird gemäß (1) der Datensatz mit der entsprechenden ID in der Benachrichtigungstabelle unter der als Parameter übergebenen ID herausgezogen. Setzen Sie schließlich mit ② den Wert der markierten Spalte des Datensatzes auf true.
Sie sollten es jetzt implementieren können! !! !!
Recommended Posts