Triggering Javascript from a Ruby form

Hello again,

I've managed to hack together an uploader, but I need a progress bar to
go with it. I ended up using FTP to upload, and got a way to find the
progress while it's uploading. I split that off into another function in
the controller, which is all well and good.

The problem is that I need to repeatedly call the how_finished function
while the file is uploading. The form goes to the uploading function, so
I need another way to repeatedly call how_finished. The best way seems
to be with Javascript and AJAX, but I can't find a good way of setting
up and calling a Javascript function to get the information from the
controller. Looking at other Ruby progress bars
(http://railsillustrated.com/screencast-file-uploads-progress-in-rails-passenger.html)
it seems to be possible to call the controller with Javascript, but that
also requires a separate module for Apache that doesn't work for FTP
uploads. I've been looking around at JSON, but I don't really understand
it or how to use it to do what I want.

I'm pretty sure I have all the information I need in the program, the
problem is getting it all together and I'm not sure if that's even
possible. Does anyone have ideas?

I think one of the things you might need is a 'timer', which will let
your code 'sleep' before calling again your 'how_finished' function. I
have never done this but remember reading about it, I googled for
'javascript sleep timer' and one of the links I found was this:
http://www.daniweb.com/forums/thread47199.html

In order to communicate with the server from Javascript I would look
into Prototype or jQuery. They simplify enormously the code in
Javascript to be able to communicate with your server using AJAX.

I hope this gets you started.

A. Leek wrote:

I'm pretty sure I have all the information I need in the program, the
problem is getting it all together and I'm not sure if that's even
possible. Does anyone have ideas?

It may be too narrowly supported for what your trying, but you can go to
the HTML5 route. Check out the File API:
http://dev.w3.org/2006/webapi/FileAPI/, which shows the new javascript
events that get fired when you do an upload. You can tie into the
following and perform actions all on the client side:

onloadstart
onprogress
onabort
onerror
onload
onloadend

If you need a more legacy (well, meaning it will support IE) solution
you can look at SWFUpload. It has similar events, but uses Flash and
Javascript to handle files and events.

http://swfupload.org/

pepe wrote:

I think one of the things you might need is a 'timer', which will let
your code 'sleep' before calling again your 'how_finished' function. I
have never done this but remember reading about it, I googled for
'javascript sleep timer' and one of the links I found was this:
http://www.daniweb.com/forums/thread47199.html

Be it that he is using Rails he is certainly using Prototype, or perhaps
jQuery, already.

I have to disagree with the use of a timer (setInterval) in this
context, considering the hugely evented nature of Javascript and what
already exists out there.