準備する
まず、Gemfileにactioncableとpumaを追加します 。
gem 'actioncable', github: 'rails/actioncable' gem 'puma'
ActionCableは、メインアプリケーションプロセスとは別に起動されます。 したがって、 PumaマルチスレッドWebサーバーを使用します。
建築家チャット
メインページで、ユーザーはニックネームを入力します。その後、Cookieにニックネームを書き込み、チャットページで編集します。
config / routes.rbにいくつかのルートを追加します 。
resources :messages, only: [:index, :create] resources :sessions, only: [:new, :create]
アクションコントローラーを作成します。 クッキーのニックネーム:
# app/controllers/sessions_controller.rb class SessionsController < ApplicationController def create cookies.signed[:username] = params[:session][:username] redirect_to messages_path end end
ユーザー認証フォームアプリ/ビュー/セッション/ new.html.slim:
= form_for :session, url: sessions_path do |f| p = f.label :username, ' ' p = f.text_field :username p = f.submit ''
チャット自体では、印刷されたメッセージへの応答として200を送信します。
# app/controllers/messages_controller.rb class MessagesController < ApplicationController def create head :ok end end
ビューアプリ/ビュー/メッセージ/index.html.slim:
p = cookies.signed[:username] p #messages p = form_for :message, url: messages_path, remote: true, id: 'messages-form' do |f| p = f.label :body, ' :' p = f.text_field :body p = f.submit ''
メッセージはAJAXによってサーバーに送信されます。
ActionCalbeを構成する
ActionCableとの統合を担当する3つのクラスを作成しましょう。
# app/channels/application_cable/connection.rb module ApplicationCable class Connection < ActionCable::Connection::Base end end # app/channels/application_cable/channel.rb module ApplicationCable class Channel < ActionCable::Channel::Base end end # app/channels/messages_channel.rb class MessagesChannel < ApplicationCable::Channel def subscribed stream_from 'messages' end end
作成したディレクトリをautoload_pathsに追加することを忘れないでください。 これで、 MessagesChannelチャネルにサブスクライブしている全員が、 サブスクライブされたメソッドで定義された対応するストリームでメッセージを受信できるようになります。 - メッセージ 。
ActionCableはRedisを介したメッセージングを提供します。 すでにインストールされていると仮定します。 config / redis / cable.ymlでそれとの通信を設定する必要があります:
development: &dev :url: redis://localhost:6379 :host: localhost :port: 6379 :timeout: 1 :inline: true test: *dev production: *dev
Pumaを構成します。
# cable/config.ru require ::File.expand_path('../../config/environment', __FILE__) Rails.application.eager_load! require 'action_cable/process/logging' run ActionCable.server
ポート34523でプーマを起動します。
# /bin/bash bundle exec puma -p 34523 cable/config.ru
これで、クーガーは./bin/cableコマンドによって起動されます。
一般的なチャットにメッセージを送信する
app / controllers / messages_controller.rbを少し調整しましょう:
class MessagesController < ApplicationController def create ActionCable.server.broadcast 'messages', message: params[:message][:body], username: cookies.signed[:username] head :ok end end
最も重要なことは、チャンネル登録です。 2つのコーヒーファイルを作成してみましょう(忘れずに再取得してください):
#app/assets/javascripts/channels/messages.coffee App.messages = App.cable.subscriptions.create 'MessagesChannel', received: (data) -> $('#messages').append("<p><b>[#{data.username}]:</b> #{data.message}</p>") #app/assets/javascripts/channels/index.coffee #= require cable #= require_self #= require_tree . @App = {} App.cable = Cable.createConsumer('ws://127.0.0.1:34523')
以上です。
いつものように、小さなプロジェクト-https://github.com/lon10/live-chat