• Stars
    star
    195
  • Rank 199,374 (Top 4 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created about 16 years ago
  • Updated about 14 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Realtime Rails
Notice!

This repo has now been deprecated - please see:
http://github.com/maccman/juggernaut

Juggernaut
===========

=CONTACT DETAILS

  Author: Alex MacCaw
  E-Mail Address: [email protected]
  License: MIT
  Website: http://juggernaut.rubyforge.org
  Blog: http://www.eribium.org

=DESCRIPTION

The Juggernaut plugin for Ruby on Rails aims to revolutionize your Rails app by letting the server initiate a connection and push data to the client. In other words your app can have a real time connection to the server with the advantage of instant updates. Although the obvious use of this is for chat, the most exciting prospect for me is collaborative cms and wikis.

What Happens:

   1. Client A opens socket connection to the socket server
   2. Client B makes Ajax call to Rails
   3. Rails sends message to the socket server
   4. Socket server broadcasts message to clients

Juggernaut Features:

    * Allows a real time connection with a client - Rails can literally push javascript in real time to the client which is then evaluated.
    * Push server - written in Ruby.
    * Integrated, as a plugin, into Rails.
    * Subscribers can subscribe to multiple channels, and broadcasters can broadcast to multiple channels.
    * Subscribers can provide a 'unique_id' and broadcasters can send data to specific clients.
    * Add and remove channels at runtime
    * Uses Flash 8 - installed on more than 98% of computers.
    * Supports all the major browsers (uses ExternalInterface): Firefox 1+, IE 6+ and Safari 2+.

Requirements:

    * Rails 2.0.2 or edge
    * json gem (gem install json)
    * EventMachine gem (gem install eventmachine)
    * juggernaut gem (gem install juggernaut)


===============================================
INSTALLATION
===============================================

   1. From your Rails Dir:
      script/plugin install git://github.com/maccman/juggernaut_plugin.git
   2. Make sure to include the appropriate JavaScripts in your views/layouts
      in the header of your views
      <%= javascript_include_tag 'prototype', :juggernaut %>
   3. Add this to your view/layout head:
      <%= juggernaut %>
   4. Make sure the juggernaut gem is installed (gem install maccman-juggernaut -s http://gems.github.com ) and run:
      juggernaut -g juggernaut.yml
      juggernaut -c juggernaut.yml
   5. Run script/server and visit the Jugged up page.
   6. Then, to send data to juggernaut, execute this in the console:
      Juggernaut.send_to_all("alert('hi from juggernaut')")

Usage

To demonstrate Juggernaut I'll walk you through building a simple chat.

Start the push server going by running:
juggernaut -g juggernaut.yml
juggernaut -c juggernaut.yml

The chat controller:

class ChatController < ApplicationController
  def index
  end
	
  def send_data
    render :juggernaut do |page|
      page.insert_html :top, 'chat_data', "<li>#{h params[:chat_input]}</li>"
    end
    render :nothing => true
  end
end


The index.html.erb

	<html>
	  <head>
	    <%= javascript_include_tag :defaults, :juggernaut %>
	    <%= juggernaut %>
	  </head>
	  <body>
	    <%= form_remote_tag(
	          :url => { :action => :send_data },
	          :complete => "$('chat_input').value = ''" ) %>
	      <%= text_field_tag( 'chat_input', '', { :size => 20, :id => 'chat_input'} ) %>
	      <%= submit_tag "Add" %>
	    </form>
	    <ul id="chat_data" style="list-style:none">
	    </ul>
	  </body>
	</html>

Start the webserver going with:
ruby script/server

Try it and see what you think. If it doesn't work please visit the faq.

Other ways of rendering to juggernaut:

render :juggernaut do |page|
  page.alert('hi')
end

render_juggernaut(:action => 'whatever')

===============================================
More usage information, examples and support
===============================================

=== Channel Usage ===

<%= juggernaut(:channels => ['one', 'two', 'three']) %>
render :juggernaut => {:type => :send_to_channels, :channels => ['one']} do |page|
  page.alert('hi')
end

Client id usage:
<%= juggernaut(:client_id => session[:user_id]) %>
render :juggernaut => {:type => :send_to_clients, :client_ids => [1, 2, 3]} do |page|
  page.alert('hi')
end

Other juggernaut render options:
OPTION_TYPE                     PARAMS
:send_to_all                  
:send_to_channels               :channels
:send_to_channel                :channel
:send_to_client                 :client_id
:send_to_clients                :client_ids
:send_to_client_on_channel      :client_id,  :channel
:send_to_clients_on_channel     :client_ids, :channel
:send_to_client_on_channels     :client_id, :channels
:send_to_clients_on_channels    :client_ids, :channels

You can also call these methods directly on the Juggernaut class:
Juggernaut.send_to_clients('data', [1,2,3])

For authentication options and callbacks see the juggernaut.yml configuration file.

Usage and examples: http://ncavig.com/blog/
Support and forums: http://groups.google.com/group/Juggernaut-for-Rails?hl=en

=== Getting remote clients to connect ===

Firstly you will need to configure juggernaut_hosts.yml in your Rails app to point to the proper IP of the push server (rather than 127.0.0.1).
For example:
:hosts:
  - :port: 5001
    :host: 129.168.0.2
    :environment: :production

Ok, remote clients that visit pages on this server (once you restart it) will connect to the proper push server IP. BUT, if you're using IP based
authentication (recommended) you'll find that the broadcast authentication fails.
You'll need to add the Rails IP to juggernaut.yml, like so:

:allowed_ips: 
        - 127.0.0.1
        - 192.168.0.4 # IP of the Rails app

===============================================
Jquery
===============================================

To get Juggernaut working with Jquery (Prototype is used by default) follow the tutorial above with the following differences.

>>Javascripts

  You must have jquery.js (version 1.2.6 tested) and the jquery-json plugin (http://www.jdempster.com/wp-content/uploads/2007/08/jquery.json.js) in the /javascripts directory. 

  You need the jquerynaut.js file in the /javascripts/juggernaut directory (found in /lib in the media directory)


>>The chat controller:

  class ChatController < ApplicationController
    def index
    end
	
    def send_data
      render :juggernaut do |page|
        page["#chat_data"].prepend "<li>#{h params[:chat_input]}</li>"
      end
      render :nothing => true
    end

  end


>>The index.html.erb

  <html>
    <head>
      <%= javascript_include_tag 'jquery', 'json', 'juggernaut/juggernaut', 'juggernaut/jquerynaut', 'juggernaut/swfobject'  %>
      <%= juggernaut %>
    </head>
    <body>
      <form action="/chat/send_data" method="get">
        <div style="margin:0;padding:0">
        <input id="chat_input" name="chat_input" size="20" type="text" value="" />
        <input name="commit" type="submit" value="Add" />
      </form>

      <script>
      $(document).ready(function(){
        $('form').submit(function(){
          $.get('/chat/send_data', { chat_input: $('#chat_input').val() } )
          return false;
        })
      })
      </script>
      <ul id="chat_data" style="list-style:none"></ul>
    </body>
  </html>



===============================================
Troubleshooting
===============================================

Check out the support forums on google groups:
http://groups.google.com/group/Juggernaut-for-Rails


More Repositories

1

juggernaut

[DEPRECATED] Realtime server push with node.js, WebSockets and Comet
JavaScript
1,626
star
2

monocle

Link and news sharing
Ruby
1,453
star
3

abba

A/B testing framework
Ruby
1,351
star
4

holla

Holla! - Rich JavaScript Application
JavaScript
1,069
star
5

jquery.magicmove

Animate DOM transitions.
JavaScript
644
star
6

bowline

Ruby/JS GUI and Binding framework (deprecated)
Ruby
637
star
7

stylo

Spine/CoffeeScript example GUI designer
JavaScript
525
star
8

saasy

Rails SaaS and SSO solution
Ruby
523
star
9

gfx

CSS3 3D animation library
JavaScript
511
star
10

nestful

Simple Ruby HTTP/REST client with a sane API
Ruby
505
star
11

ace

Sinatra for Node
CoffeeScript
461
star
12

supermodel

Ruby in-memory models
Ruby
367
star
13

acts_as_recommendable

Collaborative Filtering for Rails
Ruby
325
star
14

book-assets

Files for the O'Reilly book JavaScript Web Applications
JavaScript
310
star
15

go

go
Ruby
258
star
16

trevi

An opinionated Sinatra app generator
Ruby
251
star
17

flarevideo

HTML5 & Flash Video Player
JavaScript
243
star
18

spine.todos

A Backbone alternative idea
JavaScript
239
star
19

hermes

Messaging re-invented
Ruby
206
star
20

motivation

New Chrome tab page showing your age
JavaScript
197
star
21

spine.contacts

Spine demo contact manager
CoffeeScript
182
star
22

sprockets-commonjs

Adds CommonJS support to Sprockets
Ruby
179
star
23

macgap-rb

Generator for MacGap
Objective-C
159
star
24

sinatra-blog

A example Sinatra blog
Ruby
157
star
25

headsup

A simple Heads Up display
Ruby
145
star
26

catapult

A Sprockets/Rack build tool
Ruby
139
star
27

remail

RESTful email for Rails
Ruby
138
star
28

spine.rails3

Sample app demonstrating Spine and Rails integration
Ruby
130
star
29

bowline-twitter

Bowline Twitter client
JavaScript
112
star
30

wysiwyg

CoffeeScript
104
star
31

sinatra-pubsub

Push & Streaming for Sinatra.
Ruby
99
star
32

push-mac

Objective-C
94
star
33

stitch-rb

Stitch ported to Ruby
Ruby
93
star
34

dhash

Compare image similarity with a dhash
Ruby
93
star
35

101-school

AI generated courses
TypeScript
92
star
36

ichabod

Headless JavaScript testing with WebKit
JavaScript
85
star
37

colorcanvas

JavaScript
83
star
38

roauth

*Simple* Ruby OAuth library
Ruby
82
star
39

push

Ruby
81
star
40

juggernaut_gem

Realtime Rails
Ruby
79
star
41

spine.mobile

Spine Mobile Framework
CoffeeScript
77
star
42

super.js

Simple JavaScript framework for building RIAs (with jQuery)
JavaScript
64
star
43

oped

Email based diary
Ruby
57
star
44

remail-engine

RESTful email for Rails - see http://github.com/maccman/remail
Python
48
star
45

syncro

Synchronize state across remote clients.
Ruby
47
star
46

spine.mobile.currency

Spine Mobile currency convertor example
CoffeeScript
46
star
47

sourcemap

Ruby library for using Source Maps
Ruby
43
star
48

superapp

JavaScript state machine and class abstraction for building RIAs (deprecated! - use http://github.com/maccman/super.js)
JavaScript
31
star
49

sprockets-source-url

Adds @sourceURL support to Sprockets
Ruby
30
star
50

spine.infinite

Infinite scrolling with Spine & Rails
JavaScript
29
star
51

bowline-desktop

wxWidgets/Ruby/Webkit framework for Bowline apps
C++
28
star
52

ymockup

UI mockups using HTML and CSS
JavaScript
28
star
53

supermodel-js

SuperModel in JavaScript (deprecated! - use http://github.com/maccman/super.js)
JavaScript
26
star
54

zombies

A Facebook/Spine game.
Ruby
24
star
55

quora2

Redesigning Quora's interface, turning it into a JavaScript web application powered by Spine.
JavaScript
21
star
56

spine.mobile.contacts

Example Spine Mobile App
CoffeeScript
20
star
57

humanapi

Ruby
20
star
58

request-profile

API to access autocomplete data
JavaScript
19
star
59

gwo

Rails plugin integrating Google Web Optimizer for AB tests
Ruby
18
star
60

cft

CoffeeScript
17
star
61

jquery.upload.js

Upload files using Ajax
JavaScript
17
star
62

spine.realtime

Realtime Spine app with Rails
Ruby
15
star
63

rbyte

Byte compile Ruby 1.9.1 files and "require" support for loading compiled files.
Ruby
14
star
64

phonegap

Gem for building PhoneGap apps
Shell
13
star
65

segment-hooks

Trigger arbitrary JavaScript from Segment.com events
JavaScript
13
star
66

spine.mobile.workout

Spine Mobile Workouts Example
CoffeeScript
11
star
67

restful_email

AppEngine that provides a RESTful interface to sending emails (decrep - use http://github.com/maccman/remail)
Python
10
star
68

csbook

CoffeeScript
10
star
69

statster

Merb Web Analytics
Ruby
9
star
70

rack-modulr

Use CommonJS modules in your Rack/Rails applications
9
star
71

blossom

Demonstration chat app
JavaScript
9
star
72

dtwitter

Distributed Twitter
9
star
73

canonical

Rails plugin providing helper for canonical URLs
8
star
74

jquery.drop.js

jQuery lib abstracting the drag/drop API
JavaScript
8
star
75

alexmaccaw

Portfolio
Ruby
8
star
76

omniauth-humanapi

OmniAuth strategy for HumanAPI.
Ruby
8
star
77

the-managers-handbook

JavaScript
8
star
78

syncro-js

JavaScript library for Syncro
JavaScript
8
star
79

less-rb

Less using ExecJS
Ruby
7
star
80

spine.tutorials

Spine tutorials (DEPRECATED - use http://spinejs.com)
JavaScript
6
star
81

bowline-bundler

Specialized version of the Bundler gem for Bowline apps
Ruby
6
star
82

serveup

JavaScript
5
star
83

gdata

Recent clone of http://code.google.com/p/gdata-ruby-util (with Ruby 1.9 support)
Ruby
5
star
84

package-jquery

JavaScript
5
star
85

package-jquery-ui

JavaScript
4
star
86

jquery.tmpl

jQuery.tmpl for Hem
JavaScript
4
star
87

node-twitter-stream

Twitter Streaming API Library for Node.js
JavaScript
4
star
88

counterman

Ruby
4
star
89

monocle-assets

Ruby
4
star
90

jlink

jQuery data binding library - bind objects to HTML elements
JavaScript
4
star
91

cloudflare-r2-edge

TypeScript
4
star
92

super.todos

Port of Backbone.js Todos to Super
JavaScript
4
star
93

jeco

jQuery extension to eco
CoffeeScript
3
star
94

invoices

Test Spine app
JavaScript
3
star
95

like-detector

TypeScript
3
star
96

bp-p2p

Browser Plus P2P
Ruby
3
star
97

renoir

Simple Canvas physics engine using Verlet Integration
JavaScript
3
star
98

hnv2

Hacker News V2
CoffeeScript
3
star
99

elb-nginx-vhosts

Shell
2
star
100

socialmod

Ruby/Python/PHP client libs
PHP
2
star