前提・実現したいこと
現在作成しているアプリケーションにaction cableを導入して、リアルタイムでチャットを行えるようにしたいです。
Qiitaを参考にして実装を試みましたが思うようにいかない状態です。
お力添えをよろしくお願いいたします。
https://qiita.com/take18k_tech/items/00cc14c0eff45073ffc7
上記URLを参考にしました。
発生している問題・エラーメッセージ
ActionView::Template::Error (Devise could not find the `Warden::Proxy` instance on your request environment. Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack. If you are seeing this on one of your tests, ensure that your tests are either executing the Rails middleware stack or that your tests are using the `Devise::Test::ControllerHelpers` module to inject the `request.env['warden']` object for you.): app/views/comments/_post.html.erb:1 app/models/comment.rb:15:in `template' app/controllers/comments_controller.rb:26:in `create'
該当のソースコード
対象コントローラーのcreateアクション def create @commented = Comment.all @debate = Debate.find(params[:debate_id]) if coach_signed_in? @comment = @debate.comments.new(coach_comment_params) else user_signed_in? @comment = @debate.comments.new(user_comment_params) end if @comment.save ActionCable.server.broadcast 'room_channel', comment: @comment.template <- app/controllers/comments_controller.rb:26:in `create' else @comments = @debate.comments.includes(:coach) @comments = @debate.comments.includes(:user) render :index end end
room_channel.js import consumer from "./consumer" document.addEventListener('turbolinks:load', () => { window.messageContainer = document.getElementById('chat-page') if (messageContainer === null) { return } consumer.subscriptions.create("RoomChannel", { connected() { }, disconnected() { }, received(data) { messageContainer.insertAdjacentHTML('beforeend', data['comment']) } }) })
room_channel.rb class RoomChannel < ApplicationCable::Channel def subscribed stream_from "room_channel" end def unsubscribed # Any cleanup needed when channel is unsubscribed end end
comment.rb def template ApplicationController.renderer.render partial: 'comments/post', locals: { comment: self } <- app/models/comment.rb:15:in `template' end
create.js.erb $("input").val(""); $('.chat-page').html("<%= escape_javascript(render 'post', comments: @commented) %>")
routes.rb Rails.application.routes.draw do mount ActionCable.server => '/cable'
_post.html.erb <% if user_signed_in? %> <- app/views/comments/_post.html.erb:1 <% @commented.each do |comment| %> <% if comment.debate_id == @debate.id %> <div class="user_sign">
部分テンプレート <div class="chat-page inner" id="chat-page"> <%= render 'post', comments: @commented %> </div>
試したこと
現状の挙動としては、送信する際にformの記述が空にならず、エラーが出る。リロードすれば保存とビューへの表示がされます。
補足情報(FW/ツールのバージョンなど)
拙い文章で申し訳ありません。
わからない部分、追加して欲しいコードがありましたら、コメントいただけると幸いです。
よろしくお願いいたします。
あなたの回答
tips
プレビュー