From: Matthieu Stone Date: 2007-04-02T19:57:54+09:00 Subject: Re: updating an RJS template _while_ executing a method Hi Tom, I think that this will answer your questions. To get rid of the firebug message, just make sure that this routine >
<%= session[:message] %>
> Is rendered in the page before the periodically_call_update routine, it's easier to place this in a partial, then you can it via RJS in any controller method. I've added the poll_message div to make things a little more explicit. session[:message] = "let's get it started.." respond_to do |format| format.js { render :update do |page| page.replace 'poll_message', :partial => 'poll_message' page.visual_effect :highlight, 'poll_message', :duration => 1, :startcolor => '"#FFCCFF"', :endcolor => '"#FFFFCC"' end } end I use the respond_to mechanism to update div's on the page, rather than .rjs files. I don't need to specify :update => some_div in the periodically_call_remote routine & I can do other things, such as highlight the updated message or update another part of the screen using logic in the controller. There are upsides & downsides to doing things this way, I just find it easier to do it in the controller as it keeps all my page logic in the one place. rgds, - matt. -----Original Message----- From: ruby-talk@hinv.org [mailto:ruby-talk@hinv.org] Sent: 02 April 2007 11:17 To: ruby-talk ML Subject: Re: updating an RJS template _while_ executing a method Hey Matt, what I still don't understand is where to turn "poll_message" on and off using your JS-code? Or: what do you mean with "...in a RJS update..."? -> Inside the RJS-template of "my_io_process"? That throws quite a few errors. -> Using inline RJS rendering inside my controller? (which shouldn't work while also using an RJS template) -> somewhere else..? Also: Do I need to specify a ":update => 'my_div'" within periodically_call_remote? When I put this call inside my layout, Firebug yells at me: "poll_message not defined"... Is a "var poll_message = false" fine? Thanks for your help! Cheers, Tom. --------------------------------- On Sun, 1 Apr 2007 04:43:45 +0900 "Matthieu Stone" wrote: > Here's one way > > In your method doing the IO stuff, update a session variable with the > message that you want displayed; ie: > > def my_io_process > session[:message] = "Starting..." > do something > session[:message] = "Updated message" > do something else.. etc > session[:message] = nil > end > > > Create another controller method that just returns the value of > session[:message]. > > def update_message > render :text => session[:message]; :layout => false > end > > So now, all you need is a periodic routine that updates a div on the page > with the session[:message] contents. You can either update the div directly > from this call, or like I do, use RJS to do other things on the page. This > polling is turned on & off by the javascript variable poll_message > > <%= periodically_call_remote( > :condition => "poll_message == true", > :frequency => 2, > :url => { :action => 'update_message', :only_path => false } > ) %> > > > You can turn poll_message on & off like this, just include this code in a > RJS update whenever you want to change turn the polling on & off. > > > > > Rgds, > - matt. > > -----Original Message----- > From: ruby-talk@hinv.org [mailto:ruby-talk@hinv.org] > Sent: 31 March 2007 17:56 > To: ruby-talk ML > Subject: updating an RJS template _while_ executing a method > > I have a method doing I/O stuff which takes quite a long time. > While this method is processed, > I want the user of my tool to be informed of the current execution state. > > For example, > if the method opens a file, > I want my RJS template to render a message such as "opening file XYZ...", > if the method changes to a directory, message would be "cd to ...". > > As far as I can tell, > RJS templates are rendered AFTER the corresponding method is executed. > But I want them to run (sort of) synchronously. > Or at least have a way to trigger messages while a method is executed. > > Cheers, > Tom. > >