Je suis biaisé vers Plezi, qui est construit pour la mise à l'échelle (en utilisant Redis) et can be used to easily add websocket support to your existing web-app ... mais encore une fois, je ne pourrais pas être objectif à ce sujet.
Vous pouvez exécuter Plezi dans Rails de deux manières: en fusionnant les applications/serveurs (en utilisant le Iodine HTTP/Websocket server) ou en utilisant Redis pour synchroniser les deux applications.
Les deux méthodes sont faciles à configurer.
Pour utiliser Plezi sein de votre application Rails, ajoutez à votre plezi
Gemfile
et supprimer toute référence à « mince » ou « pumas » ou tout autre serveur de votre Gemfile
- ce qui devrait permettre à l'iode de prendre en charge automatiquement. Que placer Plezi.app
comme un middleware dans votre application. Vous pouvez inclure une application Plezi prédéfinie en lui demandant des fichiers, ou - encore plus facilement - vous pouvez écrire le code dans l'un des fichiers Rails (en utilisant peut-être les 'initialisateurs', les 'aides' ou les 'modèles'). Dossiers).
Essayez d'ajouter le code suivant pour un serveur chatroom:
require 'plezi'
# do you need automated redis support?
# require 'redis'
# ENV['PL_REDIS_URL'] = "redis://user:[email protected]:6379"
class BroadcastCtrl
def index
# we can use the websocket echo page to test our server,
# just remember to update the server address in the form.
redirect_to 'http://www.websocket.org/echo.html'
end
def on_message data
# try replacing the following two lines are with:
# self.class.broadcast :_send_message, data
broadcast :_send_message, data
response << "sent."
end
def _send_message data
response << data
end
end
route '/broadcast', BroadcastCtrl
Cela nous permet d'injecter un peu de magie Rails en Plezi et un peu de magie Plezi dans Rails ... Par exemple, il est facile de sauver la websocket d'un utilisateur UUID et envoyer les mises à jour:
require 'plezi'
# do you need automated redis support?
# require 'redis'
# ENV['PL_REDIS_URL'] = "redis://user:[email protected]:6379"
class UserNotifications
def on_open
get_current_user.websocket_uuid = uuid
get_current_user.save
end
def on_close
# wrap all of the following in a transaction, or scaling might
# create race conditions and corrupt UUID data
return unless UsersController.get_current_user.websocket_uuid == uuid
get_current_user.websocket_uuid = nil
get_current_user.save
end
def on_message data
# get data from user and use it somehow
end
protected
def get_current_user
# # use your authentication system here, maybe:
# @user ||= UserController.auth_user(cookies[:my_session_id])
end
def send_message data
response << data
end
end
route '/', UserNotifications
# and in your UserController
def UserController < ApplicationController
def update
# your logic and than send notification:
data = {}
UserNotifications.unicast @user.websocket_uuid, :send_message, data.to_json
end
end
merci. J'essaie de l'utiliser dans mon application rails, mais je suis un peu confus sur la façon de le faire. Y at-il un exemple d'application de rails que je peux regarder? J'ai aussi eu cette erreur: "J'ai essayé de mettre à jour les permissions d'exécution, cela dépend du système et peut avoir échoué." Savez-vous de quoi il s'agit? Il ne me laissera pas courir l'application plezi par défaut de plezi install. – baron816
le message "a essayé de mettre à jour les permissions d'exécution, cela dépend du système et peut avoir échoué" n'est pas une erreur. Plezi écrit toujours ceci parce que la mise à jour d'autorisation d'exécution est basée sur MacOSX et devrait fonctionner sur des systèmes semblables à unix mais pas sur des fenêtres. C'est juste un tweek qui vous permet d'exécuter l'application à partir de l'interface graphique du système d'exploitation ainsi que l'interface utilisateur du terminal .... Le reste, je vais essayer d'écrire lors de l'édition de la réponse. – Myst
merci pour votre soutien. J'ai trouvé que l'installation de la gemme ralentit javascript considérable, au moins en mode de développement. est-ce normal? J'ai encore du mal à faire le tour de la tête où tout va et va ensemble.Je pense que je pourrais attendre, y compris websockets pour un petit moment. – baron816