[Ruby on Rails] DM, Chat-Funktion

Ziel

chat.gif

Entwicklungsumgebung

ruby 2.5.7 Rails 5.2.4.3 OS: macOS Catalina

Annahme

fließen

1 Modell erstellen 2 Modell bearbeiten 3 Controller erstellen 4 Bearbeiten des Routings 5 Ansicht bearbeiten

Modell erstellen

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
Beilage 1 [Raum] Ein Raum, in dem Benutzer miteinander sprechen können.
Beilage 2 [chat] Eine Tabelle, in der gespeichert wird, was der Benutzer sagt.
Ergänzung 3 [user_room] Da Benutzer und Raum eine Viele-zu-Viele-Beziehung haben, wird dies als Zwischentabelle verwaltet.

Modell bearbeiten

Wir werden die folgenden Beziehungen herstellen. スクリーンショット 2020-09-10 22.00.12.png

app/models/room.rb


  has_many :user_rooms
  has_many :chats
Ergänzung [Relation] Es gibt viele User_rooms im Raum, also eins zu viele. Es gibt viele Chats im Raum, also eins zu viele.

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
Ergänzung [Relation] Eins-zu-viele, weil ein Benutzer viele Benutzerräume besitzt. Eins zu viele, weil ein Benutzer viele Chats führt.

Controller erstellen

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

Ergänzen Sie im Kommentar unten die schwierigen Teile.

app/controllers/chats_controller.rb


    def show
      #Holen Sie sich den Benutzer, mit dem Sie chatten möchten.
      @user = User.find(params[:id])
      
      #Aktueller Benutzer Benutzer_Zimmer in Zimmer_Weisen Sie Räumen ein Array von ID-Werten zu.
      rooms = current_user.user_rooms.pluck(:room_id)

      # user_Aus dem Raummodell
      # user_Wenn die ID mit der ID des Chat-Partners übereinstimmt,
      # room_Zeichnet auf, deren ID mit einem der oben genannten Räume übereinstimmt
      # user_Ersatz in Räumen.
      user_rooms = UserRoom.find_by(user_id: @user.id, room_id: rooms)
  
      #Wenn Benutzer_Wenn der Raum nicht leer ist
      unless user_rooms.nil?
        # @Über dem Benutzer im Raum_Platz für Raum ersetzen
        @room = user_rooms.room
      else
        #Erstellen Sie einen neuen Raum
        @room = Room.new
        @room.save
        # user_Erstellen Sie Platz für den aktuellen Benutzer und Chat-Partner
        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

Routing bearbeiten

config/routes.rb


  get 'chat/:id' => 'chats#show', as: 'chat'
  resources :chats, only: [:create]

Ansicht bearbeiten

erb:app/view/users/show.html.erb


<% if current_user != @user %>
  <%= link_to 'Chat beginnen', 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>Gepostet mit Namen</td>
            <td>Geposteter Inhalt</td>
        </tr>
    </thead>
    <tbody>
        <% @chats.each do |chat| %>
            <tr>
                <td><%= chat.user.name %></td>
                <td><%= chat.message %></td>
            </tr>
        <% end %>
    </tbody>
</table>
Ergänzung [f.hidden_field] Obwohl f.hidden_field nicht angezeigt wird, wird es verwendet, wenn Sie das senden, was Sie als Parameter senden möchten.

Referenz

Recommended Posts