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

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

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

Action Cableは、WebSocketをRailsに組み込む機能。Rails4でオプションとして存在していたWebSocketをRails5で標準機能したものです。Railsアプリケーションと同様のスタイルで、Rubyを用いたリアルタイム機能を記述できます。

Ruby

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Ruby on Rails

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

JavaScript

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

Q&A

解決済

1回答

815閲覧

ActionCableを用いているのに、画面がリロードされて困っています。

qwertyuiopp

総合スコア3

Action Cable

Action Cableは、WebSocketをRailsに組み込む機能。Rails4でオプションとして存在していたWebSocketをRails5で標準機能したものです。Railsアプリケーションと同様のスタイルで、Rubyを用いたリアルタイム機能を記述できます。

Ruby

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Ruby on Rails

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

JavaScript

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

0グッド

0クリップ

投稿2021/10/19 06:57

編集2021/10/20 06:26

イメージ説明

前提・実現したいこと

現在、ActionCableを用いたコメント機能の実装を行っているのですが、
コメントを入力後画面が一度リロードされてからコメントの表示がされており、即時更新ができず困っています。
原因がお分かりになる方、いらっしゃいましたらご教授お願い致します。

発生している問題・エラーメッセージ

デスクトップ上にエラーメッセージは表示されていませんが rails sでサーバーを起動させた際、ターミナルに
CommentChannel is transmitting the subscription confirmation
CommentChannel is streaming from comment_channel
と出力されています。

挙動的には、コメントの投稿後に即時更新でコメントの表示を行いたいところ
現在、コメント⇨画面が自動リロードされてからコメントが表示されている状態です。

該当のソースコード

comments_controller

ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = Comment.create(comment_params) 5 #redirect_to "/recipes/#{@comment.recipe_id}" 6 if @comment.save 7 ActionCable.server.broadcast 'comment_channel', content: @comment 8 end 9 end 10 11 private 12 def comment_params 13 params.require(:comment).permit(:comment).merge(user_id: current_user.id, recipe_id: params[:recipe_id]) 14 end 15end

channels/comment_channel.rb

class CommentChannel < ApplicationCable::Channel def subscribed stream_from "comment_channel" end def unsubscribed # Any cleanup needed when channel is unsubscribed end end

javascript/channels/comment_channel.js

import consumer from "./consumer" consumer.subscriptions.create("CommentChannel", { 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 html = `<p>${data.content.comment}</p>`; const comments = document.getElementById('comments'); const newComment = document.getElementById('recipe_comment_comment'); comments.insertAdjacentHTML('afterbegin', html); newComment.value = ''; } });

show.html.erb

~~~省略~~~ <%# コメント投稿機能 %> <div class="comment__container"> <% if user_signed_in? %> <%= form_with(model: [@recipe, @comment], local: true) do |f| %> <%= f.text_area :comment, placeholder: "コメントする", rows: "2" %> <%= f.submit '送信' %> <% end %> <% else %> <strong><p>※※※ コメントの投稿には新規登録/ログインが必要です ※※※</p></strong> <% end %> <div class="comments"> <h4><コメント一覧></h4> <% @comments.each do |comment| %> <strong><%= link_to comment.user.nickname, "/users/#{comment.user_id}" %>:</strong> <p><%= comment.comment %></p> <% end %> </div> </div>

試したこと

javascript/channels/comment_channel.js の newComment の定義部分が comment_comment となっていたため、recipe_comment_comment へ記述変更しましたが、即時更新機能の実現には至りませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ざっとコードを見て気になった点を記載しています。手元で動かしていないので、直らなかったらすみません。

show.html.erb

ruby

1form_with(model: [@recipe, @comment], local: true)

local: true だと通常のPOSTリクエストを送信して返ってきたHTMLを表示する挙動になるので、今回のようにページ遷移を伴わない更新をする場合は false が良いかと思います。

参考: https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_with-label-form_with+options

投稿2021/10/19 07:25

nisshiee

総合スコア7

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

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

qwertyuiopp

2021/10/19 08:20

有難うございます。 試してみましたが、直りませんでした。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問