[RUBY] [Rails DM] Erstellen wir eine Benachrichtigungsfunktion, wenn DM gesendet wird!

[Rails DM] Erstellen wir eine Benachrichtigungsfunktion!

Schritt

1: Lassen Sie uns die DM-Funktion implementieren

Machen wir es mit Bezug auf diesen Artikel!

2: Lassen Sie uns die Benachrichtigungsfunktion implementieren

2-1: Erstellen wir ein Modell

ruby


rails g model Notification visitor_id:integer visited_id:integer room_id:integer message_id:integer action:string checked:boolean

2-2: Verknüpfen Sie das erstellte Benachrichtigungsmodell mit Benutzer, Beitrag und Kommentar

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

2-3: Methode zur Erstellung einer DM-Benachrichtigung

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

2-4: Erstellen eines Benachrichtigungslistenbildschirms

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>

Bonus

Zeigen Sie die Nachrichtenliste auf leicht verständliche Weise wie LINE an

スクリーンショット 2020-09-15 18.31.50.png

Stellen wir uns zunächst vor, wie wir es umsetzen können!

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!

Lassen Sie es uns tatsächlich implementieren!

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;
}

Benachrichtigungen in der Benachrichtigungsliste aus den Benachrichtigungen verschwinden lassen, wenn sie gelesen wurden

Stellen wir uns zunächst vor, wie wir es umsetzen können!

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!

Lassen Sie es uns tatsächlich implementieren!

Erster Schritt 1

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%>
Schritt 2

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
Schritt 3

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! !! !!

Referenzartikel

[Rails] Erklären Sie, damit jeder die Benachrichtigungsfunktion implementieren kann. [Gefällt mir, kommentieren, folgen]

Recommended Posts

[Rails DM] Erstellen wir eine Benachrichtigungsfunktion, wenn DM gesendet wird!
[Schienenentnahme] Erstellen Sie eine einfache Entnahmefunktion mit Schienen
[Rails] Benachrichtigungsfunktion
Lassen Sie uns eine Suchfunktion mit Rails (Ransack) machen
Einfache Benachrichtigungsfunktion in Rails (nur wenn befolgt)
Wenn es einen Statusübergang gibt, erstellen wir eine Statusklasse
Lassen Sie uns eine TODO-App in Java 4 erstellen. Implementierung der Buchungsfunktion
Lassen Sie uns eine TODO-App in Java 6 erstellen. Implementierung der Suchfunktion
[Implementierungsverfahren] Erstellen Sie eine Benutzerauthentifizierungsfunktion mithilfe von Hexerei in Rails
Lassen Sie uns eine TODO-App in Java 8 erstellen. Implementierung von Bearbeitungsfunktionen
Abhilfe für "Ein Server läuft bereits." Fehler beim Ausführen von Rails s
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
Fügen Sie eine Suchfunktion in Rails hinzu.
Vorbereiten der Erstellung einer Rails-Anwendung
Erstellen Sie eine neue App mit Rails
Erstellen Sie eine Filterfunktion mit Acts-as-Taggable-On
[Ruby on Rails] DM, Chat-Funktion
Notizen von Personen, die beim Versuch, ein Rails-Projekt zu erstellen, gestolpert sind
[Rails] Annotate wird bei der Migration nicht ausgeführt
[Rails6] Erstelle eine neue App mit Rails [Anfänger]
Lassen Sie uns eine Java-Entwicklungsumgebung erstellen (Aktualisierung)
Erstellen Sie trotzdem eine Anmeldefunktion mit Rails
[Rails] So erstellen Sie eine Teilvorlage
[Rails] Was ist ein Punkt (.) Oder ein Doppelpunkt (:)?
[Rails 5] Erstelle eine neue App mit Rails [Anfänger]
Erstellen Sie eine Anmeldefunktion mit Swift's Optional