Activerecord update progress bar

Hi,

I have a button that links to a controller which is updating all my
entries in my db with new data, called from an external xml-based web
service. That can take several minutes, so I want to show the actual
progress in the view.

What is the best approach to do that? Java, AJAX…???

I found many ‘upload progress bars’, but I don’t want to upload a
file.

I don’t need a bar, it would be enough to show how many records are
left for updating, like this:

1/37

11/37

25/37

37/37 done!

Best way would be without refreshing the page!

Thanks in advance!
Sebastian

On 12 May 2011, at 13:19, Sebastian wrote:

I don’t need a bar, it would be enough to show how many records are
Best way would be without refreshing the page!
You hand the task over to a background server, whichever flavor you
prefer (Nanite+Redis, Beanstalkd, ). This means you can keep on
serving other requests while the task is being done, as well as having
your user browse to another page (and when he requests the status
page, you just fetch the current progress).

There’s several ways you can pass the progress to the view:

  • Periodical polling through Ajax
  • Some push server technology (there’s a Railscast at
    http://railscasts.com
    on this subject)

Best regards

Peter De Berdt

Thank you Peter for your reply!

I will look into that deeper, but I think first I have to get my
method run in the background.

I found delayed_job and I think that is exactly what I need, but I
can’t get it to work!!!

My method in my controller looks like this:

def check
@watchedfamily = Check.new(params[:id]).watchedfamily
redirect_to watchedfamilies_path
end

That calls a very large model called Check, which looks like this:

class Check
attr_reader :watchedfamily
def initialize(id)
@watchedfamily = Watchedfamily.find(id)


end
end

I already tried in my controller:

Check.new(params[:id]).delay
or
Delayed::Job.enqueue(Check.new(params[:id]))

For the second try I changed my Check-Model like this:

class Check < Struct.new(:id)
def perform
@watchedfamily = Watchedfamily.find(id)


end
end

Nothing worked at all! With the last option I get a entry in my
delayed_jobs table at least, but its never executed. I also tried
“rake jobs”, but there I get an error: rake aborted! Don’t know how to
build task ‘jobs’

I am in development and using WebBrick Server.

I really have no clue how to get this to work!!!

Kind regards
Sebastian

Now I got it!

I was watched the railcast episode about delayed_job and there nobody
told that in the background runs: rake jobs:work or something else to
run the jobs from the list!!!

Now I will look into AJAX to get an update process bar or something…