Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Websockets and Rails

Avatar for Shrikanth Shrikanth
October 02, 2014

Websockets and Rails

Using websockets in Ruby on Rails. Also integrating your node server with rails.

Avatar for Shrikanth

Shrikanth

October 02, 2014

More Decks by Shrikanth

Other Decks in Technology

Transcript

  1. Steps • Add Gem “websocket-rails” • bundle install • rails

    g websocket_rails:install • config.middleware.delete Rack::Lock • rails server
  2. Server rails g scaffold posts title:string description:string In some_action (create)

    WebsocketRails[:posts].trigger 'new', latest_post File: posts_controller create action
  3. Event Router - Client var success = function(res) { console.log("Created:

    " + res.post.title); } var failure = function(res) { console.log("Failed to create post: " + res) } dispatcher.trigger(‘create_event', post, success, failure); File: application.js
  4. Event Router - Server WebsocketRails::EventMap.describe do # using a Hash

    to specify the target subscribe :create_event, 'sockets#create_from_socket' end File: config/events.rb
  5. class SocketsController < WebsocketRails::BaseController def create_from_socket post = Post.new message

    if post.save trigger_success post: post else trigger_failure post: post.errors end end end Event Router - Server File: sockets_controller
  6. Initializing Redis on Server $redis = Redis.new(:host => 'localhost', :port=>

    6379) File: initializers/redis_init.rb (manually_created)
  7. Setting up Node Server Listen and subscribe to changes in

    rt-change (rails) channel var io = require('socket.io').listen(5001), redis = require('redis').createClient(); redis.subscribe('rt-change'); io.on('connection', function(soc){ console.log(soc.id); }); }); File: app/<folder>/<file-name>.js
  8. Setting up Node Server Publishing changes to client channel redis.on('message',

    function(channel, message){ io.sockets.emit('client-channel',JSON.parse(message)); }); File: app/<folder>/<file-name>.js
  9. Setting up Rails Client Include //= require socket.io in application.js

    socket = io.connect("http://0.0.0.0:5001"); socket.on("client-channel", function(message){ alert(message); }); File: application.js
  10. Rails - rails s Node - node <folder>/<file-name>.js Start the

    servers File: app/<folder>/<file-name>.js
  11. $redis.subscribe("my_callback") do |on| on.message do |channel, message| puts message.to_s end

    end A task to listen on callbacks from node File: app/lib/tasks/<file-name>.rake