starwars25 starwars25 - 1 year ago 114
Ruby Question

How can I push to Faye Server from Rails Controller?

I have this code:

def create
message = params[:message][:text], author: params[:message][:author])
render json: {result: 'success'}
render json: {result: 'failure'}

I have client subscribed to Faye Server:

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

I want to publish some message to Faye when a message is created. As listed in Faye Ruby Sever documentation, I have to do like this:

require 'eventmachine' {
client ='http://localhost:9292/faye')

client.subscribe('/foo') do |message|
puts message.inspect

client.publish('/foo', 'text' => 'Hello world')

But when I paste this code into my
method, it blocks the rails thread with EventMachine and server doesn't work any more.

When I use
, I get an error.

How can I publish to Faye from server? I know that there are gems like
, but I want to figure out how to do it myself. Is there any way to integrate EventMachine and Rails? Maybe I should run EventMachine on a different thread?

Answer Source

I did't use Event Machine but I use Fay-web Socket in rails , I am using thin web-server for my application to show notification.

First you add this line into you Gemfile

gem 'faye'
gem 'thin' 

Now ! run bundle install command for install gem and it's dependency.

Create a file and add given line (a rackup file for run Faye server ).

require 'rubygems'
require 'thin'
require 'faye'
faye_server = => '/faye', :timeout => 45)
run faye_server

Now add line to your application.erb file

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

Create a method with name broadcast or any name which is suitable for you in websoket.rb (first create websoket.rb file inside config/initializers ) .

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)

Now use this method inside your model or controller where you want.

In my case I am using this inside the **Notification.rb to sending notification.**


after_create :send_notificaton 

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

For subscriber

<div id="websocket" style="background-color: #999999;">
$(function () {
var faye = new Faye.Client('http://localhost:9292/faye');
        faye.subscribe('/users/<%= %>', function (data) {
            $('#websocket').text(data.username + ": " + data.msg);

Now ! Run your file using terminal

rackup -s thin -E prodcution

For details Faye websocket

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download