de Arun Mathew Kurian

Cum se implementează WebSockets în Rails 4

Cum se implementeaza WebSockets in Rails 4

WebSocket-urile pot fi implementate în Rails5 folosind ActionCable. Poate fi folosit pentru activarea multor funcții, cum ar fi chat-urile, notificările și alte module în timp real. Dar, cum se poate atinge același obiectiv fără ActionCable și Rails 5? Acest blog tratează modul în care putem implementa WebSockets în Rails 4.

Înainte de a începe, să aruncăm o privire rapidă asupra conceptului de WebSockets.

Ce sunt WebSockets și cum funcționează?

Majoritatea internetului se bazează pe solicitări / răspunsuri HTTP. Acestea permit comunicarea mai multor gazde și clienți prin intermediul transporturilor TCP / IP. Aceasta înseamnă că, de obicei, aplicațiile web nu fac nimic după ce un utilizator le vizitează într-un browser și analizează cererea și trimite un răspuns. Până când utilizatorul nu face clic pe ceva pe pagină, serverul nu va primi nicio cerere HTTP nouă. Prin urmare, va rămâne inactiv.

Există tehnologii care permit serverului să înceapă comunicarea cu clientul atunci când sunt trimise date. Exemple sunt „Push” sau „Comet”. Există tehnica de interogare lungă care menține o conexiune HTTP deschisă odată ce un client se conectează la server. Rău cu aceste abordări este suprasolicitarea HTTP. Nu este foarte bun pentru aplicațiile cu latență redusă.

Aici intră în imagine WebSockets. Acestea sunt un API care oferă conexiuni persistente „socket” între un server și un client. Aceasta permite atât serverului, cât și clientului să trimită date în orice moment.

În acest blog, vom crea un site de licitație online de jucători de cricket care utilizează prize web în Rails 4. Site-ul poate fi utilizat de mai mulți utilizatori pentru a licita pentru același jucător. Provocarea constă în actualizarea ofertei fără reîncărcarea paginii și menținerea comunicării live.

Noțiuni de bază

În principal, trei pietre prețioase sunt utilizate pentru implementarea funcționalității socketului web:

Gemfile

gem ‘faye’gem ‘thin’, require: falsegem ‘render_sync’

subţire este un server ruby ​​mic și rapid. Ar trebui instalat cu faye, deoarece bijuteria faye nu funcționează cu servere precum webrick.

Următoarea bijuterie importantă este faye. Faye este un set de instrumente pentru mesaje simple de publicare-abonare între clienți web. Se livrează cu servere de rutare a mesajelor ușor de utilizat pentru aplicațiile Node.js și Rack și clienți care pot fi utilizați pe server și în browser.

sincronizare sau render_sync gem este folosit pentru a crea parțiale în timp real cu Rails. Sincronizarea vă permite să redați parțiale pentru modelele care, cu cod minim, se actualizează în timp real în browser atunci când apar modificări pe server.

Obiectivul nostru este să avem o funcționalitate care să permită afișarea valorilor sumelor licitate pe pagina de afișare a unui utilizator. Primul pas pentru implementarea acestui lucru este instalarea șabloanelor din bijuteria de sincronizare.

șinele generează sincronizare: instalare

Și necesită sincronizare în conducta noastră de active.

app / assets / javascripts / application.js

//= require jquery//= require jquery_ujs//= require turbolinks//= require sync//= require_tree

Scriptul de configurare este necesar în aspectul aplicației

app / views / layouts / application.html.erb

<%= include_sync_config %>

Trebuie să creăm un parțial și să-l stocăm în director vizualizări / sincronizare / la fel de _bid_log_row.html.erb.

Această parțială conține valoarea ofertei utilizatorului. Va arăta astfel:

Current Bid: <%= @bid_log.amount || ‘ — ‘ rescue nil%>

Și pentru a reda acest lucru în pagina de afișare, adăugați următoarele rânduri în pagina de afișare a utilizatorilor:

app / views / users / show.html.erb

<%= sync partial: ‘bid_log_row’, resource: @bid_log %><%= sync_new partial: ‘bid_log_row’, resource: BidLog.new %>

Și, în cele din urmă, faceți modificările în BidLogsController, astfel încât să știe cum să gestioneze trimiterile de formulare la distanță. De asemenea, sincronizează noile sume licitate la locul lor.

class BidLogsController < ApplicationControllerrespond_to :html, :js
 def index  @bid_logs = BidLog.all  @new_bid = current_user.bid_logs.build  end
 def create  @bid_log = current_user.bid_logs.build(bid_log_params)  if @bid_log.save   sync_new @bid_log  end  respond_to do |format|   format.html { redirect_to user_path(@bid_log.player_id) }   format.json { head :no_content }  end end
private
 def bid_log_params  params.require(:bid_log).permit(:amount, :player_id) end
end

Configurare

Acum partea de codare de bază este terminată. Următorul pas este să configurați Faye. Faye trebuie să ruleze pe un server web separat de aplicația web în sine. Pentru a realiza acest lucru, trebuie să creați un fișier de configurare Rackup. Adăugați un fișier faye.ru la rădăcina proiectului și asigurați-vă că arată astfel:

require ‘faye’
bayeux = Faye::RackAdapter.new(:mount => ‘/faye’, :timeout =&gt; 25)
bayeux.listen(9292)

Acest fișier îi spune pur și simplu Rackup cum să pornească serverul Faye. Încercați-l pentru a vă asigura că funcționează corect. Rulați acest lucru în terminalul dvs.:

rackup faye.ru -E producție -s subțire

Înfășurându-se

Acum suntem bine să plecăm. Aplicația poate fi rulată pornind serverul Rails. Codul asociat acestui blog poate fi găsit Aici.