ruby on rails actioncableにてrender partialにてerbの<%= if %>が正常に動作しない
現在、ruby on railsにてactioncableを用いた動的なチャットを作成しています。
チャット機能は十分とは言えませんが、機能としては大体完成しました。
LINEのように送信したメッセージ、受信したメッセージを右と左に分けると考えたときに
データベースから引っ張ってきたメッセージは右と左にわけられるのですが、入力した場合、データベースにインサートされるのですが、そこから相手に通知がいかず、相手の画面に変化はなく、メッセージが表示されないという結果になりました。
実行した時のコードはいかになります。
MessageBroadcastJob
class MessageBroadcastJob < ApplicationJob
queue_as :default
def perform(message)
if message.user_id.nil?
# オールチャット用のブロードキャスト 宛先がない場合はroom_channelにストリームされる。
ActionCable.server.broadcast "room_channel",message: render_message(message)
else
# 宛先を指定した場合のストリーム ルームチャンネルの語尾にユーザIDが付与され、ブロードキャストされる
# 送る相手にストリーム
ActionCable.server.broadcast "room_channel#{message.user_id}",message: render_message(message)
# 自分にストリーム
ActionCable.server.broadcast "room_channel#{message.userid}",message: render_message(message)
end
end
private
def render_message(message)
ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message })
end
end
※ userid:自分のユーザID user_id:相手のユーザID
わかりにくくてすみません。
viewは以下のコードであります。
room.html.erb
<h1><%= @user_id_to.name %>さんとのメッセージ</h1>
<div id="messages">
<%= render @messages %>
</div>
<form>
<label>Say something:</label><br>
<input type="hidden" value= <%= @user_id_to %> data-behavior="room_speaker">
<input type="text" data-behavior="room_speaker">
</form>
render先
_message.html.erb
<% cache message do %>
<div class="message">
<% if message.userid == current_user.id %>
<p class="right_balloon">
<% else %>
<p class="left_balloon">
<% end %>
<%= message.content %>
</p>
</div>
<% end %>
しかし、render先を以下のコードにすると動的に送信、受信ができました。
<% cache message do %>
<div class="message">
<p class="left_balloon">
<%= message.content %>
</p>
</div>
<% end %>
参考になるような意見等、お待ちしております。
文章長くなってしまいましたが、よろしくお願いします。