Web Chat, Cross Browser

Hi all,

I am newly learning Rails and playing with Web Chat app. I looked through what other people have done. I tested the following very naive, skeleton app. It seems to work in my local machine when I open two Firefox (or two Safari). But it does not work cross browser, eg, Firefox-Safari. Strange? What's going on? Thanks.

- index.rhtml <% form_remote_tag :url => {:action => 'say'} do %> <%= text_field_tag 'said' %> <%= submit_tag 'Say' %> <% end %>

<%= periodically_call_remote :url => {:action => 'get_new_line' }, :frequency => 1.0 %>

- chat_controller.rb def say session[:what_said] = params[:said] @line1 = session[:what_said] end

def get_new_line @line2 = session[:what_said] end

- say.rhtml <%= @line1 %>

- get_new_line.rhtml <%= @line2 %>

I would recommend going against the Rails option here as you're making a request at least once every second to an action in your application. Imagine if 10 people were in the chat, that would mean 10 requests per second.

Think of an alternative option here, like an IRC server or similar.

Campfire does it, so it does work when done right.

You could have a look at juggernaut, does use a flash file and extra process running on the server.

http://juggernaut.rubyforge.org/

Best regards

Peter De Berdt

Yea just wanted to second the juggernaut option. I am using it and it works great.

Are you storing everything in the session ? The session will be stored per user (ie per browser) so it's not surprising it doesn't work.

Fred

Hmm, I see. I guess everything has to be stored in models. Thanks.

Yeah, I should try Juggernaut. But I wonder if my web host will allow push server stuff. Thanks.

Sly -

Yeah, I should try Juggernaut. But I wonder if my web host will allow push server stuff. Thanks.

if you're not adverse to having your chat scripts being stored on a public service lingr.com can be integrated easily in a day.

I've had nice success making private password protected chat rooms for a community using lingr.

You can find docs on their blog, etc.

cheers, Jodi

And a third from me. I met the developer of Juggernaut at RailsConf and saw a demo. Very slick. It uses a small flash object to keep a persistent connection open between client and server so you eliminate a lot of issues there. From a development perspective it was basically as simple as saying "open chat channel 9" (work out the details for your app) and then the client/browser just listens.

Another option, if you're shopping, is Jabber. I was leaning towards this until I ran into Juggernaut.

Good luck, AndyV

Jabber is a communication protocol. You'll still need a Comet (official term) implementation like Juggernaut to push chats out to the user or do polling like Gmail's in-browser chat client does (IIRC),

Jason

Right, Jabber won't allow a persistent connection without some "comet" alternative. I already advocated Juggernaut but here is another alternative:

http://shooting-star.rubyforge.org/wiki/wiki.pl?Making_A_Chat_System_Within_5_Minutes

That is using a more standard comet implementation called shooting_star.

Like Juggernaut, it opens a persistent connection which can be used for implementing a chat system.

I have looked at both and I chose Juggernaut but it easily could have been the wrong decision. However, juggernaut was so easy to use and it worked so I had no reason to move away from it. As long as the browser has Flash, it works like a charm.

Thank you all for great suggestions! In fact, I installed Juggernat today. I followed its README file example included below. It works, but whenever Rails call is made, alert window ( "Juggernaut: Received data: try { ... " ) pops up all the time. How can I block this?

-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

-index.rhtml

  <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>

Yea, I get that too. It only happens in development (on your local PC). It is for your debugging purposes. Once deployed to the server, these messages are not displayed. (Make sure on the server, the juggernaut config file is set to production mode).