質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

1431閲覧

rails チャット機能(DM)を非同期でラインのように左右に表示したい。

nao---

総合スコア1

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/03/30 04:03

前提・実現したいこと

こちらのサイトを参考にして非同期のチャットアプリを実装出来たのですが、
全て左側に表示されているので、ユーザごとに左右に表示したいと思っています。
https://qiita.com/OgawaNorihiro/items/6d9f85d8e89d1def4f15#usersindexhtmlerb%E3%81%AE%E4%BD%9C%E6%88%90

試したこと

<% if current_user.id == direct_message.user_id %>
<%= direct_message.content %>
<% else %>
<%= direct_message.content %>
<% end %>
上記のように試してみましたが、そうなると非同期ではなくなりました。
再読み込みで表示される。

どなたかご教授していただきたいです。
ruby 2.6.6
rails 5.2.4

下記がコードとなっております。
ほぼコードは参考にしたサイトと変わってないと思います。
よろしくお願いおいします。

class User < ApplicationRecord has_many :entries has_many :direct_messages has_many :rooms, through: :entries end
class DirectMessage < ApplicationRecord belongs_to :user belongs_to :room after_create_commit { DirectMessageBroadcastJob.perform_later self } end
class DirectMessageBroadcastJob < ApplicationJob queue_as :default def perform(direct_message) ActionCable.server.broadcast "room_channel_#{direct_message.room_id}", direct_message: render_direct_message(direct_message) end private def render_direct_message(direct_message) ApplicationController.renderer.render partial: 'direct_messages/direct_message', locals: { direct_message: direct_message } end end
class RoomsController < ApplicationController before_action :authenticate_user! def show @room = Room.find(params[:id]) #present?の戻り値は真偽値。よって、trueの場合、 if Entry.where(:user_id => current_user.id, :room_id => @room.id).present? @direct_messages = @room.direct_messages @entries = @room.entries else redirect_back(fallback_location: root_path) end end def create @room = Room.create(:name => "DM") @entry1 = Entry.create(:room_id => @room.id, :user_id => current_user.id) @entry2 = Entry.create(params.require(:entry).permit(:user_id, :room_id).merge(:room_id => @room.id)) redirect_to room_path(@room.id) end end
views/rooms/show.html.erb <div style="margin-top: 100px; margin-left: 100px;"> <h1>Chat room</h1> <div class="chats-wrapper"> <div class="chats-inside"> <div id="direct_messages" data-room_id="<%= @room.id %>"> <%= render @direct_messages %> </div> </div> <div class="chatForm"> <div class="form-message"> <form> <input type="text" id="chat-input" data-behavior="room_speaker"> </form> </div> </div> </div>
direct_messages/direct_message.html.erb <div class="each-say"> <%= direct_message.content %> <%= direct_message.user.nickname %> </div>
class RoomChannel < ApplicationCable::Channel def subscribed # stream_from "some_channel" stream_from "room_channel_#{params['room']}" end def unsubscribed # Any cleanup needed when channel is unsubscribed end def speak(data) DirectMessage.create! content: data['direct_message'], user_id: current_user.id, room_id: params['room'] end end
javascripts/channels/room.coffee document.addEventListener 'turbolinks:load', -> App.room = App.cable.subscriptions.create { channel: "RoomChannel", room: $('#direct_messages').data('room_id') }, connected: -> disconnected: -> received: (data) -> $('#direct_messages').append data['direct_message'] speak: (direct_message) -> @perform 'speak', direct_message: direct_message $('#chat-input').on 'keypress', (event) -> if event.keyCode is 13 App.room.speak event.target.value event.target.value = '' event.preventDefault()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問