前提・実現したいこと
ruby on rails でチャット機能を作っています。
javaのコンソールでApp.room.speak("test")
とうてばtest
と表示されるようになったのですが、フォームから送信するときに、一度javaのコンソールで先ほどのようにメッセージを送らないとフォームから文字を送信することができません。更新ボタンなどを押してから、フォームからの送信を行っても何も起きません。
なんでも良いので気付かれた点や気になった点がございましたら、アドバイスをよろしくお願いします。
該当のソースコード
//channels/room.coffee App.room = App.cable.subscriptions.create "RoomChannel", 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) -> #alert data['message'] $('#messages').append data['message'] # Called when there's incoming data on the websocket for this channel speak: (message) -> @perform 'speak', message: message $ (document).on 'keypress', '[data-behavior~=room_speaker]', (event) -> if event.keyCode is 13 # return = send App.room.speak event.target.value event.target.value = '' event.preventDefault()
//room_channel.rb class RoomChannel < ApplicationCable::Channel def subscribed stream_from "room_channel" ActionCable.server.broadcast 'room_channel', message: data['message'] end def unsubscribed # Any cleanup needed when channel is unsubscribed end def speak(data) Message.create! content: data['message'] end end
//models/message.rb class Message < ApplicationRecord after_create_commit { MessageBroadcastJob.perform_later self } end
//jobs/message_broadcast_job.rb class MessageBroadcastJob < ApplicationJob queue_as :default def perform(message) ActionCable.server.broadcast 'room_channel', message: render_message(message) end private def render_message(message) ApplicationController.renderer.render(partial: 'messages/message', locals: { message: message }) end # Do something later end
//show.html.erb <h1>Chat room</h1> <div id = "messages"> <%= render @messages %> </div> <form> <label>Say something:</label><br> <input type="text" data-behavior="room_speaker" > </form>
//application.js //= require rails-ujs //= require activestorage //= require turbolinks //= require_tree . //= require jquery //= require jquery_ujs //= require jquery.turbolinks
//Gemfile gem 'jquery-rails'#追記 gem 'jquery-turbolinks'#追記
//cable.js (function() { this.App || (this.App = {}); App.cable = ActionCable.createConsumer(); }).call(this);
//models/message.rb class Message < ApplicationRecord after_create_commit { MessageBroadcastJob.perform_later self } validates :content, {presence: true} end
試したこと
・サーバーの再起動
・bundle install
補足情報(FW/ツールのバージョンなど)
ruby 2.2.3
rails 5.2.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 05:50