[RUBY] Schienen ~ Die Nachrichtenfunktion verstehen ~

Entschlüsseln Sie die Nachrichtenfunktion

Ziel

Verstehen Sie die Bedeutung des Codes für Nachrichtenfunktionen, die Sie nicht vollständig verstehen. Referenzseite "Machen wir es möglich, DM (Direktnachricht) mit Rails zu senden" https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03

Bild

Erstellen Sie ein Benutzermodell mit devise, und Sie können Nachrichten zwischen Benutzern austauschen.

** Benutzermodell: Benutzerinformationen Raummodell: Diesmal ein Bild von zwei Benutzern, die den Chatraum betreten Einstiegsmodell: Welcher Benutzer zu welchem Raum gehört Nachrichtenmodell: Welche Nachricht hat der Benutzer in welchem Raum gesendet? **

Inhalt

Bilden Sie zuerst eine Assoziation. user.rb

user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  has_many :messages, dependent: :destroy
  has_many :entries, dependent: :destroy
end

entry.rb

entry.rb
class Entry < ApplicationRecord
  belongs_to :user
  belongs_to :room
end

room.rb

room.rb
class Room < ApplicationRecord
  has_many :messages, dependent: :destroy
  has_many :entries, dependent: :destroy
end

message.rb

message.rb
class Message < ApplicationRecord
  belongs_to :user
  belongs_to :room
end

Dies ist das gleiche wie es ist, also werde ich es weglassen

Erstellen Sie dann einen Controller

$ rails g controller users index show
$ rails g controller rooms
$ rails g controller messages

users_controller.rb

class UsersController < ApplicationController
  before_action :authenticate_user!, :only => [:show]
  def index
    @users=User.all
  end

  def show
    @user=User.find(params[:id])
    @currentUserEntry=Entry.where(user_id: current_user.id)
    @userEntry=Entry.where(user_id: @user.id)
unless @user.id == current_user.id
  @currentUserEntry.each do |cu|
    @userEntry.each do |u|
      if cu.room_id == u.room_id then
        @isRoom = true
        @roomId = cu.room_id
      end
    end
  end
  unless @isRoom
    @room = Room.new
    @entry = Entry.new
  end
end
   
    @user=User.find(params[:id])
    @currentUserEntry=Entry.where(user_id: current_user.id)
    @userEntry=Entry.where(user_id: @user.id)

Lesen Sie den Showteil. Zunächst wird dieser Teil, aber oben, die Information von user.id, die beim Anfordern von user # show gedrückt wurde, von der find-Methode durchsucht und der Instanzvariablen @user zugewiesen. In der zweiten Zeile wird die where-Methode verwendet, um das Ergebnis der Suche von der ID von current_user @currentUserEntry zuzuweisen. Das Ergebnis der Suche anhand der ID des Benutzers der Instanzvariablen, der in der ersten Zeile mit der where-Methode in der dritten Zeile gesucht wurde, wird @UserEntry zugewiesen. Hier werden zwei Variablen definiert. Und wenn der Raum erstellt wird, müssen sowohl der aktuell angemeldete Benutzer als auch der Benutzer, der auf "Chat" geklickt hat, in der Tabelle "Einträge" aufgezeichnet werden, damit die where-Methode nach diesem Benutzer sucht. Gibt es. Zuerst habe ich mich gefragt, warum ich die where-Methode verwendet habe, aber dies dient nur dazu, zu überprüfen, ob die beiden in der Eintragstabelle angegebenen user.ids registriert sind. Wenn sie also nicht registriert sind, verwenden Sie die find-Methode usw. Wenn Sie es verwenden, erhalten Sie eine Fehlermeldung, wenn es nicht gefunden werden kann.

unless @user.id == current_user.id
  @currentUserEntry.each do |cu|
    @userEntry.each do |u|
      if cu.room_id == u.room_id then
        @isRoom = true
        @roomId = cu.room_id
      end
    end
  end
  unless @isRoom
    @room = Room.new
    @entry = Entry.new
  end
end

Verwenden Sie hier die if-Anweisung, um zu überprüfen, ob @user und current_user identisch sind. Wenn sie unterschiedlich sind, füllen Sie sie aus, damit der folgende Code übergeben wird. Übergeben Sie die Informationen der beiden Variablen @currentUserEntry und @userEntry als Blockargumente und prüfen Sie, ob sich in den beiden Argumenten dieselbe Room_id befindet. Ersetzen Sie @isRoom durch true, falls vorhanden. Die room_id von current_user wird @roomId zugewiesen. Wenn in den beiden Einträgen nicht dieselbe room_id gefunden wird, haben wir einen Prozess zum Erstellen eines neuen Raums und Eintrags hinzugefügt.

<% unless @user.id == current_user.id %>
          <% if @isRoom == true %>
            <p><a href="/rooms/<%= @roomId %>">eine Nachricht schicken</a>
          <% else %>
            <%= form_for @room do |f| %>
              <%= fields_for @entry do |e| %>
                <%= e.hidden_field :user_id, :value=> @user.id %>
              <% end %>
            <%= f.submit "eine Nachricht schicken" %>
            <% end %>
       <% end %>
  <% end %>

Dann schauen Sie sich die Ansicht an. Wie der Controller wird @isRoom verwendet, um eine bedingte Verzweigung durchzuführen, wenn ein Chatraum bereits erstellt wurde und wenn er nicht erstellt wurde. Wenn @isRoom wahr ist, können Sie eine Schaltfläche im Chat anzeigen lassen und zu dem bereits erstellten Chat wechseln. Auch wenn der Chatraum noch nicht erstellt wurde @room = Room.new @entry = Entry.new Parameter müssen an gesendet werden. Hier ist der @ -Zimmer des übergeordneten Modells die Instanzvariable form_for und der Eintrag @ent die Instanzvariable fields_for. Jetzt können Sie in der Tabelle "Räume" gespeichert werden.

rooms_controller.rb

class RoomsController < ApplicationController
  before_action :authenticate_user!
  def create
    @room = Room.create
    @entry1 = Entry.create(:room_id => @room.id, :user_id => current_user.id)
    @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id))
    redirect_to "/rooms/#{@room.id}"
  end

  def show
    @room = Room.find(params[:id])
    if Entry.where(:user_id => current_user.id, :room_id => @room.id).present?
      @messages = @room.messages
      @message = Message.new
      @entries = @room.entries
    else
      redirect_back(fallback_location: root_path)
    end
  end
end

Als nächstes verstehen Sie den Raumcontroller.

def create
    @room = Room.create
    @entry1 = Entry.create(room_id: @room.id, user_id: current_user.id)
    @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id))
    redirect_to "/rooms/#{@room.id}"
end

create erstellt einen neuen Raum und Eingang. Der Eintrag registriert zwei Benutzer, current_user und show user. Erstellen Sie Room_id mit @room = Room.create.

@entry1 = Entry.create(room_id: @room.id, user_id: current_user.id) Speichern Sie die ID von current_user und die ID des neu erstellten Raums in (Eintragsinformationen von current_user)

@entry2=Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id)) Weisen Sie die vom Benutzer / show zugewiesenen @ user-Informationen der ID zu. Die neue: room_id wird dort zusammengeführt und registriert. Und gleichzeitig mit Erstellen erstellen Sie um, damit der Chatraum geöffnet wird.

def show
  @room = Room.find(params[:id])
  if Entry.where(user_id: current_user.id,room_id: @room.id).present?
    @messages = @room.messages
    @message = Message.new
    @entries = @room.entries
  else
    redirect_back(fallback_location: root_path)
  end
end

Da es notwendig ist, den entsprechenden Chatraum zuerst in der Show anzuzeigen, suchen Sie mit der Suchmethode nach Parametern. Suchen Sie in der Tabelle "Einträge" des durchsuchten Raums die ID des aktuell angemeldeten Benutzers und die ID des Chatrooms, der der where-Methode zugeordnet ist, und überprüfen Sie, ob der Datensatz vorhanden ist. Wenn die Bedingung falsch ist, verwenden Sie redirect_back. Dies ist eine Beschreibung, um zur vorherigen Seite zurückzukehren. Wenn die Bedingung erfüllt ist, weisen Sie @messages mithilfe der Zuordnung @messages @ room.messages zu, um die mit der ID des Chatrooms verknüpfte Nachricht in der Nachrichtentabelle anzuzeigen.

Wenn Sie eine neue Nachricht erstellen, führen Sie zum Erstellen einer Instanz der Nachricht Message.new aus und weisen Sie sie @message zu.

Fügen Sie dann @ room.entries in eine Instanzvariable mit dem Namen @entries ein, um Informationen zu user_id in der Entries-Tabelle abzurufen, damit room / show.html.erb Informationen wie den Namen des Benutzers anzeigen kann.

messages_controller.rb
class MessagesController < ApplicationController
  before_action :authenticate_user!, :only => [:create]

  def create
    if Entry.where(:user_id => current_user.id, :room_id => params[:message][:room_id]).present?
      @message = Message.create(params.require(:message).permit(:user_id, :content, :room_id).merge(:user_id => current_user.id))
      redirect_to "/rooms/#{@message.room_id}"
    else
      redirect_back(fallback_location: root_path)
    end
  end
end

In diesem Abschnitt wird der Mechanismus zum Erstellen einer Nachricht beschrieben. Stellen Sie sicher, dass die Schlüssel: message und: room_id aller Nachrichteninformationen einschließlich des von form_for gesendeten Inhalts ordnungsgemäß eingegeben wurden. Wenn die Bedingung erfüllt ist, setzen Sie Message.create, um die Nachricht zu speichern und die als Parameter für user_id,: content, room_id gesendeten Werte in der Messages-Tabelle zuzulassen. Da die Nachricht vom aktuell angemeldeten Benutzer gesendet wurde, führen Sie die Informationen für diese Benutzer-ID zusammen. Wenn die Bedingung falsch ist, schreiben Sie flash.now [: alert], um eine Flash-Nachricht auszugeben. Wenn Sie abschließend unter beiden Bedingungen auf die Originalseite umleiten, sind Sie fertig.

Recommended Posts

Schienen ~ Die Nachrichtenfunktion verstehen ~
[Rails] Was war die Fehlermeldung?
Rails Flash-Nachricht
[Schienen] Kategoriefunktion
Schienen folgen der Funktion
[Rails] Benachrichtigungsfunktion
Über die Doppelfunktion -java
Lassen Sie uns die Funktion verstehen!
[Rails] Tag-Ranking-Funktion
Beherrsche das [Rails] Scope!
Implementieren Sie die Anwendungsfunktion in Rails
Implementierung der Fuzzy-Suchfunktion für Schienen
[Schienen] Implementieren Sie die Benutzersuchfunktion
Suchfunktion mit [Rails] Ransack
[Rails] Ich habe die Validierungsfehlermeldung mit asynchroner Kommunikation implementiert!
[Rails] Implementierung der Kategoriefunktion
Ein Hinweis zum Seed-Feature von Ruby on Rails
[Rails] EC-Site-Cart-Funktion
[Rails] Implementierung der Tutorial-Funktion
[Rails] Implementieren Sie die Image-Posting-Funktion
[Rails] Implementierung einer ähnlichen Funktion
[Rails] Löschen Sie die Migrationsdatei
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Durch das Verständnis von REST werden die Aussichten für das Ruby on Rails-Lernprogramm verbessert
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 5) erstellt:
(Ruby on Rails6) Erstellen Sie eine Funktion zum Bearbeiten des veröffentlichten Inhalts
[Rails] Implementierung der CSV-Importfunktion
[Rails] Asynchrone Implementierung der Like-Funktion
Fügen Sie eine Suchfunktion in Rails hinzu.
[Schienen] Überprüfen Sie den Inhalt des Objekts
[Ruby on Rails] Paging-Funktion eingeführt
[Rails] Implementierung der Bildvorschau
[Rails] Tag-Verwaltungsfunktion (unter Verwendung von Acts-as-Taggable-On)
Über das Symbol <%%> in Rails erb
Erläuterung der Reihenfolge der Schienenrouten
[Rails] Über die Implementierung der Like-Funktion
[Rails] Implementierung der Benutzerrückzugsfunktion
[Rails] Implementierung der CSV-Exportfunktion
Implementieren Sie eine einfache Anmeldefunktion in Rails
[Ruby on Rails] CSV-Ausgabefunktion
[Rails] Sprachposting-Funktion ~ Cloudinary, CarrierWave
[Rails] Kommentarfunktion (Registrierung / Anzeige / Löschung)
[Rails] Ich habe versucht, die Anwendung zu löschen
Implementierung der Funktionsfunktion [Rails] gem ancestry category