>

앱 인증에 Devise를 사용한 다음 채팅 (대화/메시지) 기능을 앱에 통합했습니다. 채팅은 정상적으로 작동하지만 채팅 한 사용자를 삭제하자마자 "사용자 ID = 1을 찾을 수 없습니다"(ActiveRecord 오류)

conversations controller :

class ConversationsController < ApplicationController
    before_action :authenticate_user!
    def index
        @users = User.all
        @conversations = Conversation.all
    end
    def create
        if Conversation.between(params[:sender_id], params[:recipient_id]).present?
            @conversation = Conversation.between(params[:sender_id], params[:recipient_id]).first
        else
            @conversation = Conversation.create!(conversation_params)
        end
        redirect_to conversation_messages_path(@conversation)
    end
    private
    def conversation_params
        params.permit(:sender_id, :recipient_id)
    end
end

mesages controller :

class MessagesController < ApplicationController
    before_action do
    @conversation = Conversation.find(params[:conversation_id])
    end
    def index
        @messages = @conversation.messages
        @message = @conversation.messages.new
    end
    def new
        @message = @conversation.messages.new
    end
    def create
        @message = @conversation.messages.new(message_params)
        if @message.save
            redirect_to conversation_messages_path(@conversation)
        end
    end
    private
    def message_params
        params.require(:message).permit(:body, :user_id)
    end
end

conversation model :

class Conversation < ActiveRecord::Base
    belongs_to :sender, :foreign_key => :sender_id, class_name: 'User'
    belongs_to :recipient, :foreign_key => :recipient_id, class_name: 'User'
    has_many :messages, dependent: :destroy
    validates_uniqueness_of :sender_id, :scope => :recipient_id
    scope :between, -> (sender_id, recipient_id) do
        where("(conversations.sender_id = ? AND conversations.recipient_id = ?) OR (conversations.sender_id = ? AND conversations.recipient_id = ?)", sender_id, recipient_id, recipient_id, sender_id)
    end
end

message model :

class Message < ActiveRecord::Base
    belongs_to :conversation
    belongs_to :user
    validates_presence_of :body, :conversation_id, :user_id
    def message_time
        created_at.strftime("%m/%d/%y at %l:%M %p")
    end
end

문서에 따라 표준 방식을 고안 한 다음 채팅을 추가했습니다.

업데이트 :

이 줄에서 코드가 충돌했습니다 : ( views/conversations/index.html.erb )

<% @conversations.each do |conversation| %>
      <% if conversation.sender_id == current_user.id || conversation.recipient_id == current_user.id %>
       <% if conversation.sender_id == current_user.id %>
         <% recipient = User.find(conversation.recipient_id) %>
       <% else %>
         <% recipient = User.find(conversation.sender_id) %>
       <% end %>
       <h3><%= link_to recipient.email, conversation_messages_path(conversation)%></h3>
      <% end %>
     <% end %>

특히 <% recipient = User.find(conversation.sender_id) %> 에서

사용자 삭제 기능의 작동 방식에 대해서는 코딩하지 않았으며 Devise가 그 일을하도록 내버려 두었습니다

  • 답변 # 1

    <올>

    belongs_to 가있는 대화에 추가  선택 사항 : true 발신자/수신자가 삭제 될 수 있기 때문에

    손이 "아니오"이고 "삭제 된"레이블을 표시한다는 점에서 처리합니다

    recipient = User.find_by(id: conversation.recipient_id) %> or conversation.recipient 를하려고  (연결 만 사용) ... 그리고 객체가 없는지 확인

관련 자료

  • 이전 ruby on rails - 네임 스페이스 내부의 UsersController
  • 다음 flutter - 빌드 메소드 외부에서 mediaqueryof (context) widthheight에 어떻게 액세스합니까?