Comprenez la signification du code pour les fonctionnalités de message que vous ne comprenez pas entièrement. Site de référence "Faisons en sorte que Rails envoie des DM (message direct)" https://qiita.com/nojinoji/items/2b3f8309a31cc6d88d03
Créez un modèle utilisateur avec un appareil et vous pourrez échanger des messages entre les utilisateurs.
** Modèle utilisateur: informations utilisateur Modèle de salle: cette fois, une image de deux utilisateurs entrant dans la salle de chat Modèle d'entrée: quel utilisateur appartient à quelle pièce Modèle de message: quel message l'utilisateur a envoyé dans quelle pièce **
Commencez par créer une association. 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
C'est la même chose, donc je vais l'omettre
Ensuite, créez un contrôleur
$ 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)
Lisez la partie spectacle. Tout d'abord, cette partie, mais en haut, les informations de user.id qui ont été pressées lors de la demande de l'utilisateur # show sont recherchées par la méthode find et affectées à la variable d'instance @user. La deuxième ligne utilise la méthode where pour attribuer le résultat de la recherche de l'ID de current_user à @currentUserEntry. Le résultat de la recherche à partir de l'ID de la variable d'instance recherchée par l'utilisateur dans la première ligne à l'aide de la méthode where de la troisième ligne est affecté à @UserEntry. Deux variables sont définies ici. Et lorsque la salle est créée, l'utilisateur actuellement connecté et l'utilisateur qui a appuyé sur "pour discuter" doivent être enregistrés dans le tableau Entrées, de sorte que la méthode where recherche cet utilisateur. y a-t-il. Au début, je me demandais pourquoi j'utilisais la méthode where, mais c'est juste pour vérifier si les deux user.ids spécifiés dans la table d'entrée sont enregistrés, donc s'il n'est pas enregistré, utilisez la méthode find etc. Si vous l'utilisez, vous obtiendrez une erreur s'il ne peut pas être trouvé.
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
Ici, utilisez l'instruction sauf pour vérifier si @user et current_user sont identiques. S'ils sont différents, remplissez pour que le code suivant passe. Transmettez les informations de deux variables, @currentUserEntry et @userEntry, comme arguments de bloc et vérifiez si le même Room_id se trouve dans les deux arguments. Remplacez par true pour @isRoom, le cas échéant. Le room_id de current_user est affecté à @roomId. Si le même room_id n'est pas trouvé dans les deux entrées, nous avons ajouté un processus pour créer une nouvelle salle et une nouvelle entrée.
<% unless @user.id == current_user.id %>
<% if @isRoom == true %>
<p><a href="/rooms/<%= @roomId %>">envoyer un message</a>
<% else %>
<%= form_for @room do |f| %>
<%= fields_for @entry do |e| %>
<%= e.hidden_field :user_id, :value=> @user.id %>
<% end %>
<%= f.submit "envoyer un message" %>
<% end %>
<% end %>
<% end %>
Regardez ensuite la vue. Comme le contrôleur, @isRoom est utilisé pour effectuer des branchements conditionnels lorsqu'une salle de discussion a déjà été créée et lorsqu'elle n'a pas été créée. Lorsque @isRoom est vrai, vous pouvez faire apparaître un bouton dans le chat et passer au chat qui a déjà été créé. De plus, si la salle de chat n'a pas encore été créée @room = Room.new @entry = Entry.new Les paramètres doivent être envoyés à. Ici, la @room du modèle parent est la variable d'instance form_for et la @entry est la variable d'instance fields_for. Vous êtes maintenant prêt à être enregistré dans le tableau Pièces.
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
Ensuite, comprenez le contrôleur de salles.
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 crée une nouvelle pièce et une nouvelle entrée. L'entrée enregistre deux utilisateurs, current_user et show user. Créez Room_id avec @room = Room.create.
@entry1 = Entry.create(room_id: @room.id, user_id: current_user.id) Enregistrez l'id de current_user et l'id de la salle nouvellement créée dans (Informations d'entrée de current_user)
@entry2=Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(room_id: @room.id)) Attribuez les informations @user attribuées par user / show à id. Le nouveau: room_id y est fusionné et enregistré. Et en même temps que créer, redirigez pour que la salle de discussion s'ouvre.
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
Puisqu'il est nécessaire d'afficher d'abord la salle de discussion correspondante dans show, recherchez les paramètres avec la méthode find. Dans le tableau Entrées de la salle recherchée, recherchez l'ID de l'utilisateur actuellement connecté et l'ID de la salle de conversation qui lui est associée avec la méthode where, et vérifiez si l'enregistrement existe. Si la condition est fausse, utilisez redirect_back, qui est une description pour revenir à la page précédente. Si la condition est vraie, remplacez @ room.messages en utilisant l'association dans @messages pour afficher le message associé à l'ID de la salle de conversation dans la table Message.
De plus, lors de la création d'un nouveau message, pour créer une instance du message, faites Message.new et attribuez-le à @message.
Ensuite, afin d'afficher des informations telles que le nom de l'utilisateur dans rooms / show.html.erb, placez @ room.entries dans une variable d'instance appelée @entries et obtenez les informations user_id de la table Entrées.
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
Cette section décrit le mécanisme de création d'un message. Assurez-vous que les clés: message et: room_id de toutes les informations de message, y compris le contenu envoyé par form_for, sont correctement saisies. Si la condition est vraie, définissez Message.create pour enregistrer le message et autoriser les valeurs envoyées en tant que paramètres pour user_id ,: content, room_id dans la table Messages. Étant donné que le message a été envoyé par l'utilisateur actuellement connecté, fusionnez les informations pour cet user_id. Et si la condition est fausse, écrivez flash.now [: alert] pour émettre un message flash. Enfin, avec la redirection, dans les deux conditions, redirigez vers la page d'origine et vous avez terminé.
Recommended Posts