Je vais le préparer moi-même.
users Table des utilisateurs
rooms Un endroit pour avoir une salle de chat
entries Une table qui gère les utilisateurs entrant dans la salle de chat
messages Table pour gérer les messages
$ rails g model room name:string
$ rails g model entry user:references room:references
$ rails g model message user:references room:references content:text
$ rails db:migrate
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
class Entry < ApplicationRecord
  belongs_to :user
  belongs_to :room
end
room.rb
class Room < ApplicationRecord
  has_many :messages, dependent: :destroy
  has_many :entries, dependent: :destroy
end
message.rb
class Message < ApplicationRecord
  belongs_to :user
  belongs_to :room
end
$ rails g controller users index show
$ rails g controller rooms
$ rails g controller messages
routes.rb
resources :users, only: [:show,:edit,:update]
resources :messages, only: [:create]
resources :rooms, only: [:create,:show]
users_controller.rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
    # current_Rechercher un utilisateur dans la table Entrées
    @currentUserEntry = Entry.where(user_id: current_user.id)
    #Trouvez l'utilisateur pour envoyer des DM à partir du tableau Entrées
    @userEntry = Entry.where(user_id: @user.id)
    if @user.id != current_user.id
      #avec currentUser@Retirez les entrées de chaque utilisateur une par une et vérifiez si les deux salles existent déjà
      @currentUserEntry.each do |cu|
        @userEntry.each do |u|
          #Si une chambre pour 2 personnes existe déjà
          if cu.room_id == u.room_id
            @isRoom = true
            #room_Extraire l'identifiant
            @roomId = cu.room_id
          end
        end
      end
      #S'il n'y a pas de place pour 2 personnes
      unless @isRoom
        #Créer une nouvelle pièce et une nouvelle entrée
        @room = Room.new
        @entry = Entry.new
      end
    end
  end
end
ruby:users/show.html.slim
  - if @user.id != current_user.id
    #Doit se suivre
    - if (current_user.following? @user) && (@user.following? current_user)
      #Si vous avez déjà une chambre (vous avez déjà échangé des DM)
      - if @isRoom == true
         #Entrez dans la pièce
         =link_to room_path(@roomId) do
           i.fas.fa-envelope
      #S'il n'y a pas de place (nouveau DM)
      - else
        #Envoyer des données à deux modèles, pièce et entrée
        = form_with @room, local: true do |f|
          = fields_for @entry do |e|
            #L'entrée est l'utilisateur_Parce que vous devez envoyer l'[email protected]écifiez l'identifiant
            = e.hidden_field :user_id, value: @user.id
          #Cette fois, nous utilisons un bouton pour le lien_Utilisez une balise. Normalement f.OK avec soumettre
          = button_tag type: 'submit' do
            i.fas.fa-envelope
rooms_controller
class RoomsController < ApplicationController
  def create
    @room = Room.create
    # current_Entrée utilisateur
    @entry1 = Entry.create(room_id: @room.id, user_id: current_user.id)
    #Entrée (utilisateurs) du côté récepteur du DM/utilisateur en spectacle_la salle est passée car l'identifiant est passé_Je prends l'identifiant et le fusionne)
    @entry2 = Entry.create((entry_params).merge(room_id: @room.id))
    redirect_to room_path(@room)
  end
  def show
    @room = Room.find(params[:id])
    #courant dans le tableau des entrées_user.Vérifiez s'il existe un salon de discussion associé à l'identifiant
    if Entry.where(user_id: current_user.id,room_id: @room.id).present?
      @messages = @room.messages
      @message = Message.new
      #Substitut pour afficher les informations utilisateur de la salle de chat
      @entries = @room.entries
    else
      redirect_back(fallback_location: root_path)
    end
  end
  private
    def entry_params
      params.require(:entry).permit(:user_id, :room_id)
    end
end
ruby:rooms/show.html.slim
.row
  .col-lg-2
  .col-lg-8.frame-notification
    <hr>
    #Afficher la liste s'il y a un message
    - if @messages.present?
      - @messages.each do |message|
        .row.balloon5
          #Cette fois, je veux afficher mon message sur le côté droit, donc la branche conditionnelle suivante
          - if current_user.name == message.user.name
            .col-lg-12.text-right
              .chatting
                .say
                  = message.content
                <br>
                small= message.created_at.to_s(:datetime_jp)
          - else
            .col-lg-2.text-center
              = attachment_image_tag message.user, :image, format: 'jpeg', fallback: "noimage.png ", size: "50x40"
              small= link_to message.user.name, user_path(message.user), class: "d-block mt-1"
              <br>
            .col-lg-10.text-left
              .chatting
                .says
                  p= message.content
                <br>
                small= message.created_at.to_s(:datetime_jp)
        <hr>
    - else
Il n'y a pas de messages p.
    .row
      .col-lg-2
      .col-lg-8.text-center
        = form_with model: @message, local: true do |f|
          = f.text_field :content, placeholder: "Veuillez saisir un message" , size: 50
          = f.hidden_field :room_id, value: @room.id
          = f.submit "Publier", class: 'btn btn-outline-secondary btn-sm ml-2'
messages_controller.rb
class MessagesController < ApplicationController
  def create
    #chambre envoyée sous forme_id et courant_user.Vérifiez si les données avec identifiant sont dans Entry
    if Entry.where(user_id: current_user.id, room_id: params[:message][:room_id]).present?
      #contenu et salle_Étant donné que l'identifiant est envoyé sous forme, l'utilisateur_Fusionner les identifiants pour rédiger un nouveau message
      @message = Message.create((message_params).merge(user_id: current_user.id))
      redirect_back(fallback_location: root_path)
    else
      flash[:alert] = "Échec de l'envoi du message."
      redirect_back(fallback_location: root_path)
    end
  end
  private
    def message_params
      params.require(:message).permit(:user_id, :content, :room_id)
    end
end
**Achevée! ** **
Recommended Posts