f_f926
@f_f926 (たろさん)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ActionCableでcurrent_userIDを取得する方法をご教授いただきたいです

解決したいこと

Ruby on Railsで対話型のラインのようなチャット機能をActionCableを使用して作成しています。
リアルタイムチャット自体は実装できたのですが、別ブラウザで機能確認を行ったところ、ログイン中のユーザーidがうまく取得できず、送信側の表示になってしまいます。リロードを行うと送信(右側)受信(左側)それぞれ正常な位置に戻ります。
送信者・受信者は、message_channel.jsファイルのreceived(date)で条件分岐を行っています。

解決方法をご教授いただきたいです。

発生している問題・エラー

下記Gifのような現象が発生しています。
リアルタイムチャット

該当するソースコード

-- Message_controller.rb --
class MessagesController < ApplicationController
  before_action :set_message, only: %i[index create]

  def index
    @user = @room.user_id
    @messages = @room.messages.includes(:user).order(:id)
    @message = current_user.messages.build
  end

  def create
    @message = Message.create!(message_params)
    ActionCable.server.broadcast 'message_channel', content: @message, user: current_user,
                                                    time: @message.created_at.strftime('%Y/%m/%d %H:%M:%S')
  end

  private

  def message_params
    params.require(:message).permit(:content, :image).merge(user_id: current_user.id, room_id: params[:room_id])
  end

  def set_message
    @room = Room.find(params[:room_id])
  end
end
-- _message.html.erb --
<div class="message" id="message">
<% @messages.each do |message| %>
  <% if current_user.id == message.user_id %>
  <div class="my-content" id="my-message">
    <div class="my-message">
      <div class="my-message-date">
        <%= l message.created_at %>
      </div>
      <div class="my-message-content" >
        <%= simple_format(h message.content) %>
      </div>
      <%# <%= image_tag message.image.variant(resize: '500x500'), class: 'my-message-image' if message.image.attached? %>
    </div>
  </div>
  <% else %>
  <div class="content">
    <div class="upper-message">
      <div class="message-user">
        <%= message.user.nickname %>
      </div>
    </div>
    <div class="lower-message">
      <div class="message-content" >
        <%= simple_format(h message.content) %>
      </div>
      <div class="message-date">
        <%= l message.created_at %>
      </div>
      <%# <%= image_tag message.image.variant(resize: '500x500'), class: 'message-image' if message.image.attached? %>
    </div>
  </div>
  <% end %>
<% end %>
</div>
-- message_channel.js --
import consumer from "./consumer"

consumer.subscriptions.create("MessageChannel", {
  connected() {
    // Called when the subscription is ready for use on the server
  },

  disconnected() {
    // Called when the subscription has been terminated by the server
  },

  received(data) {
    const nickName = `${data.user.nickname}`
    const content = `${data.content.content}`
    const messageData = `${data.time}`
    const currentUser = `${data.user.id}`
    const sendUser = `${data.content.user_id}`
    if (currentUser == sendUser) {
      const HTML = `
      <div class="my-content">
        <div class="my-message">
          <div class="my-message-date">
            ${messageData}
          </div>
          <div class="my-message-content">
            ${content}
          </div>
        </div>
      </div>
      `
      const messages = document.getElementById('message')
      const newMessage = document.getElementById('content')
      messages.insertAdjacentHTML('beforeend', HTML)
      newMessage.value=''
    } else {
      const HTML = `
      <div class="content">
        <div class="upper-message">
          <div class="message-user">
            ${nickName}
          </div>
        </div>
        <div class="lower-message">
          <div class="message-content" >
            ${content}
          </div>
          <div class="message-date">
            ${messageData}
          </div>
        </div>
      </div>
      `
      const messages = document.getElementById('message')
      const newMessage = document.getElementById('content')
      messages.insertAdjacentHTML('beforeend', HTML)
      newMessage.value=''
    }
  }
});
-- message_channel.rb --
class MessageChannel < ApplicationCable::Channel
  def subscribed
    stream_from 'message_channel'
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end
-- application_cable/connection.rb --
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private

    def find_verified_user
      if verified_user = User.find_by(id: cookies.signed[:user_id])
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

Messages_controllerにて、ActionCableに渡すインスタンスの変更、connection.rbでcurrent_userを定義したりを行いましたが、受信者と送信者でビューを変えることができませんでした。
恐れ入りますが、どなたかご教授いただきたいです。

0

No Answers yet.

Your answer might help someone💌