0

J'ai lu que Rails 5 (quelqu'un sait quand cela sera publié?) Incorporera un support pour les websockets qui rendront la messagerie instantanée plus facile à incorporer. Mais j'essaye de mettre en place quelque chose maintenant pour une application assez construite. Si tout se passe bien, je pourrais bientôt avoir un certain nombre d'utilisateurs, donc il faudra aussi l'adapter. J'ai regardé le Private Pub de Ryan Bates qui est un peu vieux, Heroku's websocket example (je suis déployé sur Heroku), Websocket-rails, actioncable, et peut-être quelques autres. La plupart sont très impliqués, alors je me demande quelle est ma meilleure option, ou si Rails 5 sortira bientôt et que je devrais attendre ça?Rails 4.2 Quelle est actuellement la meilleure façon d'intégrer la messagerie instantanée dans une application?

Merci.

Répondre

2

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 pleziGemfile 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 
+0

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

+0

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

+0

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

0

Rails 5 a été libéré. Je vous recommande de mettre à jour et aller avec actioncable.

À long terme, il devrait être la meilleure option car il fera partie du noyau de Rails et il est développé, utilisé et entretenu par Basecamp. Ils investiront suffisamment d'efforts pour s'assurer qu'il est stable, évolutif et accepté par la communauté.

+0

Merci pour le conseil. Le câble d'action est ce que je vais finir par utiliser. J'ai passé pas mal de temps à essayer de l'incorporer dans mon application, mais il semble que ce soit sur Rails 5 que j'utilise l'implémentation la plus élémentaire. Et ce n'est définitivement pas fini. J'ai donc décidé de rester jusqu'à ce que tout soit prêt. – baron816

+1

Est-ce toujours vrai? Pouvez-vous utiliser la gemme actioncable avec les rails 4? –

+0

Je n'ai pas pu utiliser actioncable avec rails4, cela dépend de actionpack5 qui dépend des rails 5 –