Please wait dialog

Hi everyone

I have an application that needs to execute a shell script with quite a long execution time. I would like to show some "Please wait"-dialog that can be updated with status from the script. Does anyone have any ideas of how to do this in Rails.

Kindest regards

Erik Lindblad

Erik Lindblad wrote:

I have an application that needs to execute a shell script with quite a long execution time. I would like to show some "Please wait"-dialog that can be updated with status from the script. Does anyone have any ideas of how to do this in Rails.

I do something similar in one of my old applications. Mine has a page of data, some of which loads quickly and is displayed immediately and some which takes longer. For my app, the user clicks a button to select which of the longer execution time parts to display, but the principle is the same.

The long running task is a remote call to:

  def prepare_get_details     render :update do |page|       page["info"].update("<h2>Preparing details, please wait...</h2>")       page << remote_function(:url => {:action => :get_details,                                        'values[days]' => params[:values][:days],                               :update => 'info')     end   end

This updates my "info" div with a message (you could display a progress bar or something if you like). It then adds javascript to the page to call the long running task and set this to replace the contents of the same "info" div to replace the "please wait" message. This javascript is executed when it is received by the browser.

The initial button is displayed on the main page using:   <div id="info">     <%= button_to_function "Show Details...",        remote_function(:url => {:action => :prepare_get_details,                                     'values[days]' => params[:values][:days]}) %>   </div>

This allows me to reuse the same calls easily in multiple views. You could utilise other options of remote_function like :loading, etc to do it all in one call, but I haven't played extensively with this.

Excellent

I have not used render :update but it seems to be what I am looking for. Many, many thanks.

Regards

Erik Lindblad

Erik Lindblad wrote:

I have not used render :update but it seems to be what I am looking for. Many, many thanks.

Note also that you can do it all in one go with something like:

<div id="info">   <%= link_to_remote "Show Details...",         :update => 'info',         :url => {:action => :get_details},         :before => "$('info').update('Please wait...')" %> </div>

This is simpler than my previous suggestion and more efficient (only 1 call to the server instead of 2). I originally wrote the 2 step approach to avoid including JavaScript directly (I usually prefer to just call the Rails helpers - the :before value is JS), but if I was to re-write it, I'd probably use this method here and create a helper method to wrap it for re-use.