
ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina
Créer 1 modèle 2 Modifier le modèle 3 Création d'un contrôleur 4 Modification du routage 5 Modifier la vue
Terminal
$ rails g model Room
$ rails g model Chat user_id:integer room_id:integer message:string
$ rails g model UserRoom user_id:integer room_id:integer
$ rails db:migrate
 Nous ferons les relations suivantes.

app/models/room.rb
  has_many :user_rooms
  has_many :chats
 app/chats/room.rb
  belongs_to :user
  belongs_to :room
app/user_rooms/room.rb
  belongs_to :user
  belongs_to :room
app/models/user.rb
  has_many :user_rooms
  has_many :chats
 Terminal
$ rails g controller chats
app/controllers/chats_controller.rb
class ChatsController < ApplicationController
  def show
    @user = User.find(params[:id])
    rooms = current_user.user_rooms.pluck(:room_id)
    user_rooms = UserRoom.find_by(user_id: @user.id, room_id: rooms)
    unless user_rooms.nil?
      @room = user_rooms.room
    else
      @room = Room.new
      @room.save
      UserRoom.create(user_id: current_user.id, room_id: @room.id)
      UserRoom.create(user_id: @user.id, room_id: @room.id)
    end
    @chats = @room.chats
    @chat = Chat.new(room_id: @room.id)
  end
  def create
    @chat = current_user.chats.new(chat_params)
    @chat.save
    redirect_to request.referer
  end
  private
  def chat_params
    params.require(:chat).permit(:message, :room_id)
  end
end
Dans le commentaire ci-dessous, complétez les parties difficiles.
app/controllers/chats_controller.rb
    def show
      #Obtenez avec quel utilisateur discuter.
      @user = User.find(params[:id])
      
      #Utilisateur utilisateur actuel_chambre dans la chambre_Attribuez un tableau de valeurs d'identifiant aux salles
      rooms = current_user.user_rooms.pluck(:room_id)
      # user_À partir du modèle de pièce
      # user_Si l'identifiant correspond à l'identifiant du partenaire de chat,
      # room_Enregistrements dont l'ID correspond à l'une des pièces ci-dessus
      # user_Remplacer dans les chambres.
      user_rooms = UserRoom.find_by(user_id: @user.id, room_id: rooms)
  
      #Si l'utilisateur_Si la pièce n'est pas vide
      unless user_rooms.nil?
        # @Au-dessus de l'utilisateur dans la salle_Remplacer la pièce par la pièce
        @room = user_rooms.room
      else
        #Autre que cela, créez une nouvelle pièce
        @room = Room.new
        @room.save
        # user_Créer une salle pour l'utilisateur actuel et le partenaire de chat
        UserRoom.create(user_id: current_user.id, room_id: @room.id)
        UserRoom.create(user_id: @user.id, room_id: @room.id)
      end
      @chats = @room.chats
      @chat = Chat.new(room_id: @room.id)
    end
config/routes.rb
  get 'chat/:id' => 'chats#show', as: 'chat'
  resources :chats, only: [:create]
erb:app/view/users/show.html.erb
<% if current_user != @user %>
  <%= link_to 'Démarrer la discussion', chat_path(@user.id)%>
<% end %>
erb:app/view/chats/show.html.erb
<%= form_with model: @chat do |f| %>
    <%= f.text_field :message %>
    <%= f.hidden_field :room_id %>
    <%= f.submit %>
<% end %>
<table>
    <thead>
        <tr>
            <td>Publié par nom</td>
            <td>Contenu publié</td>
        </tr>
    </thead>
    <tbody>
        <% @chats.each do |chat| %>
            <tr>
                <td><%= chat.user.name %></td>
                <td><%= chat.message %></td>
            </tr>
        <% end %>
    </tbody>
</table>
 Recommended Posts