Persyaratan Sebelumnya:
- Ruby 2.0.0+
- Rel 4.0.0+
- Merah
- Puma
Inisialisasi:
Buat redis.rb
file penginisialisasi di config/initializers
direktori, mengglobalkan instance redis
. Ini juga merupakan ide yang baik untuk mengatur heartbeat
utas (Apa pun dari 5 detik hingga 5 menit tidak apa-apa, tergantung pada kebutuhan Anda):
$redis = Redis.new
heartbeat_thread = Thread.new do
while true
$redis.publish("heartbeat","thump")
sleep 15.seconds
end
end
at_exit do
heartbeat_thread.kill
$redis.quit
end
Pengontrol:
Anda perlu menambahkan dua metode ke ChatController
Anda , pub
dan sub
. Peran pub
adalah untuk memublikasikan acara obrolan dan pesan ke redis
, dan sub
untuk berlangganan acara ini. Seharusnya terlihat seperti ini:
class ChatController < ApplicationController
include ActionController::Live
skip_before_filter :verify_authenticity_token
def index
end
def pub
$redis.publish 'chat_event', params[:chat_data].to_json
render json: {}, status: 200
end
def sub
response.headers["Content-Type"] = "text/event-stream"
redis = Redis.new
redis.subscribe(['chat_event', 'heartbeat']) do |on|
on.message do |event, data|
response.stream.write "event: #{event}\ndata: #{data}\n\n"
end
end
rescue IOError
logger.info "Stream Closed"
ensure
redis.quit
response.stream.close
end
end
Di routes
. Anda , buat pub sebuah POST
dan sub sebuah GET
, dan cocokkan jalurnya dengan sesuatu seperti /chat/publish
dan /chat/subscribe
.
Coffeescript / Javascript:
Dengan asumsi halaman web Anda yang sebenarnya untuk aplikasi obrolan ada di /chat
, Anda perlu menulis beberapa Javascript untuk benar-benar mengirim dan menerima pesan obrolan.
Untuk memudahkan pemahaman, anggaplah halaman web Anda hanya memiliki kotak teks dan tombol. Menekan tombol akan mempublikasikan konten kotak teks ke aliran obrolan, kita dapat melakukannya menggunakan AJAX:
$('button#send').click (e) ->
e.preventDefault()
$.ajax '/chat/publish',
type: 'POST'
data:
chat_data: {
message: $("input#message").val()
timestamp: $.now()
error: (jqXHR, textStatus, errorThrown) ->
console.log "Failed: " + textStatus
success: (data, textStatus, jqXHR) ->
console.log "Success: " + textStatus
Sekarang, Anda harus dapat berlangganan dan menerima pesan obrolan juga. Anda perlu menggunakan EventSource
untuk ini. Menggunakan EventSource , buka saluran untuk SSE sehingga Anda dapat menerima acara, dan menggunakan data tersebut untuk memperbarui tampilan. Dalam contoh ini, kami hanya akan mencatatnya ke konsol javascript.
Kodenya akan terlihat seperti ini:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Catatan: Tempatkan kedua blok kode di atas di controllername.coffee
your Anda file, untuk contoh ini seharusnya chat.js.coffee
di app/assets/javascript
direktori. Anda juga perlu memastikan itu sedang dimuat di pipa aset. require
di application.js
. Anda file (jika Anda belum memanggil require tree .
).
Aktifkan Permintaan Paralel:
Di lingkungan pengembangan, Anda harus mengaktifkan permintaan paralel dengan menambahkan dua baris ini ke config/environments/development.rb
Anda :
config.preload_frameworks = true
config.allow_concurrency = true
Sekarang jalankan browser Anda, ramban ke /chat
dan lihat keajaibannya. Saat Anda mengetik pesan dan mengklik tombol, pesan akan diterima oleh semua instance halaman web tersebut.
Nah ini dia cara membuat aplikasi chat dasar di rails
menggunakan ActionController::Live
dan Redis
. Kode akhir jelas akan sangat berbeda tergantung pada kebutuhan Anda, tetapi ini akan membantu Anda memulai.
Beberapa sumber daya lainnya yang harus Anda periksa:
- Pembuatan Cinta yang Lembut - Apakah Ini Langsung?
- Railscasts - #401 - ActionController::Live
- SitePoint - Obrolan Mini dengan Rails dan SSE
- Github - mohanraj-ramanujam / streaming langsung
- Thoughtbot - Contoh Obrolan menggunakan SSE