[RUBY] Rails ~ Comprendre la fonction de message ~

Décrypter la fonction de message

Cible

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

image

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

Contenu

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

Rails ~ Comprendre la fonction de message ~
[Rails] Quel était le message d'erreur?
Message Flash Rails
[Rails] Fonction de catégorie
Les rails suivent la fonction
[Rails] Fonction de notification
À propos de la double fonction -java
Comprenons la fonction!
[rails] fonction de classement des balises
Maîtrisez la portée [Rails]!
Implémenter la fonction d'application dans Rails
Implémentation de la fonction de recherche floue Rails
[Rails] Implémenter la fonction de recherche d'utilisateurs
Fonction de recherche à l'aide de [rails] ransack
[Rails] J'ai implémenté le message d'erreur de validation avec une communication asynchrone!
[Rails] Implémentation de la fonction de catégorie
Une note sur la fonction de départ de Ruby on Rails
[Rails] Fonction de panier de site EC
[Rails] Implémentation de la fonction tutoriel
[Rails] Implémenter la fonction de publication d'images
[Rails] Implémentation d'une fonction similaire
[Rails] Supprimer le fichier de migration
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
Comprendre REST améliorera les perspectives du didacticiel Ruby on Rails
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):
(Ruby on Rails6) Créer une fonction pour modifier le contenu publié
[Rails] Implémentation de la fonction d'importation CSV
[Rails] Implémentation asynchrone de la fonction similaire
Ajoutez une fonction de recherche dans Rails.
[Rails] Vérifiez le contenu de l'objet
[Ruby on Rails] Introduction de la fonction de pagination
[Rails] Implémentation de la fonction de prévisualisation d'image
[Rails] Fonction de gestion des balises (en utilisant des actes comme des balises)
À propos du symbole <%%> dans Rails erb
Explication de l'ordre des itinéraires ferroviaires
[Rails] À propos de la mise en œuvre de la fonction similaire
[Rails] Implémentation de la fonction de retrait utilisateur
[Rails] Implémentation de la fonction d'exportation CSV
Créer une fonction de pagination avec Rails Kaminari
Implémenter une fonction de connexion simple dans Rails
[Ruby on Rails] Fonction de sortie CSV
[Rails] Fonction de publication vocale ~ Cloudinary, CarrierWave
[Rails] Fonction de commentaire (enregistrement / affichage / suppression)
[Rails] J'ai essayé de supprimer l'application
[Rails] Implémentation de la fonction de catégorie d'ascendance gemme