森田です。
前回の記事で blocknote と yjs と liveblocks を用いた 共同編集の実装を紹介しました。
とても簡単に実装できるというは大きな利点なのですが、これは Nextjs ありきの実装となっており、react ではどう実装するのという話になってしまいます。
なので今回は React + Rails の構成で yjs と ActionCable を用いたコンフリクトフリーな共同編集を実装してみましょう!
info
Rails は開発環境構築が完了しており、5000 ポートで立ち上がる前提で進めます。 フロントは Vite + React で開発します。
実装
Rails
まずActionCableを使うにあたって必要なgemをインポートしておきます。
/config/application.rb
require "action_cable/engine"
続いて開発環境のみでどのオリジンからもActionCableに接続できるようにしておきます。 該当する行のコメントアウトを外すだけです。
/config/environments/development.rb
config.action_cable.disable_request_forgery_protection = true
では実際にActionCableを作成してみましょう。
ストリーム先を自由に選択できるようにしたいので、idによって変化するようにします。
/app/channels/sync_channel.rb
class SyncChannel < ApplicationCable::Channel
def subscribed
document_id = params[:id]
stream_from("document-#{document_id}")
end
def receive(message)
document_id = params[:id]
ActionCable.server.broadcast("document-#{document_id}", message)
end
end
