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
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? **
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