如何从Rails控制器推送到Faye Server?

我有这个代码:

def create message = Message.new(text: params[:message][:text], author: params[:message][:author]) if message.save render json: {result: 'success'} else render json: {result: 'failure'} end end 

我有客户订阅了Faye Server:

 var subscription = client.subscribe('/foo', function (message) { getMessages(); }); 

我想在创建消息时向Faye发布一些消息。 如Faye Ruby Sever文档中所列,我必须这样做:

 require 'eventmachine' EM.run { client = Faye::Client.new('http://localhost:9292/faye') client.subscribe('/foo') do |message| puts message.inspect end client.publish('/foo', 'text' => 'Hello world') } 

但是当我将此代码粘贴到我的create方法中时,它会使用EventMachine阻止rails线程,并且服务器不再起作用。

当我在没有EventMachine情况下使用client.publish ,出现错误。

如何从服务器发布到Faye? 我知道有像faye-railsprivate_pub这样的gem,但我想知道如何自己做。 有没有办法集成EventMachine和Rails? 也许我应该在另一个线程上运行EventMachine?

我没有使用Event Machine,但我在rails中使用Fay-web Socket ,我使用瘦Web服务器为我的应用程序显示通知。

首先,将此行添加到 Gemfile中

 gem 'faye' gem 'thin' 

现在! 运行bundle install命令,用于安装gem及其依赖项。

创建一个faye.ru文件并添加给定的行(运行Faye服务器的一个rackup文件)。

 require 'rubygems' require 'thin' require 'faye' faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45) run faye_server 

现在在application.erb文件中添加一行

 <%= javascript_include_tag 'application', "http://localhost:9292/faye.js", 'data-turbolinks-track' => true %> 

websoket.rb创建一个名为broadcast的方法或任何适合您的websoket.rb (首先在config/initializers创建websoket.rb文件)。

 module Websocket def broadcast(channel, msg) message = {:channel => channel, :data => msg} uri = URI.parse("http://localhost:9292/faye") Net::HTTP.post_form(uri, :message => message.to_json) end end 

现在在您想要的模型或控制器中使用此方法。

在我的情况下,我在** Notification.rb中使用它来发送通知。**

 after_create :send_notificaton def send_notification broadcast("/users/#{user.id}", {username: "#{user.full_name }", msg: "Hello you are invited for project--| #{project.name} | please check your mail"}) end 

对于订户

 

现在! 使用终端运行您的faye.ru文件

 rackup faye.ru -s thin -E prodcution 

详情 Faye websocket