Action Cableの習作: CableReadyを試す

外観

後学のために前回写経したAction Cable ExamplesCableReadyを導入してみたいと思います。

参照

CableReady completes the ActionCable story and expands the utility of web sockets in your Rails app

環境

macOS 10.15.4
Ruby 2.7.1
Rails 6.0.3
Yarn 1.22.4
Node 13.12.0
cable_ready 4.1.2
cable_ready@4.1.2

リポジトリ

方針

コメント追加のDOM操作にCableReadyを用います。

app/views/comments/create.js.erb

(() => {
  const el = document.getElementById('comments')
  el.insertAdjacentHTML('beforeend', '<%=j render @comment %>')
  const new_comment = document.getElementById('new_comment')
  new_comment.outerHTML = '<%=j render "comments/new", message: @message %>'
})()

準備

ドキュメントのSetupに書かれている通りに下記のコマンドを実行します。

bundle add cable_ready
yarn add cable_ready

手順

コンシューマのreceivedでCableReady.performを呼び出します。
また、元コードのreceivedでは現在のユーザについてコメントの重複追加を防止していますが、今回DOM操作をCableReadyに移動しますので、この処理は不要になります。

app/javascript/channels/comments_channel.js

import CableReady from 'cable_ready'

//...

  received(data) {
    if (data.cableReady) {
      CableReady.perform(data.operations)
    }
  },


app/jobs/comment_relay_job.rb

コメント追加のDOM操作にCableReadyを用います。

class CommentRelayJob < ApplicationJob
  include CableReady::Broadcaster
  queue_as :default

  def perform(comment)
    html_comment = CommentsController.render comment
    channel_name = "messages:#{comment.message_id}:comments"
    cable_ready[channel_name].insert_adjacent_html(
      selector: '#comments',
      html: html_comment
    )
    cable_ready.broadcast
  end
end

app/views/comments/create.js.erb

コメント追加のDOM操作を削除します。

(() => {
  const new_comment = document.getElementById('new_comment')
  new_comment.outerHTML = '<%=j render "comments/new", message: @message %>'
})()

以上です。

この記事が気に入ったらサポートをしてみませんか?