如何从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-rails
或private_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