From: Jeremy McAnally Date: 2007-04-03T10:42:21+09:00 Subject: Re: updating an RJS template _while_ executing a method My suggestion: run your task using BackgrounDrb or something similar. Use periodically_call_remote to poll the execution's status until it's completed. --Jeremy On 4/2/07, ruby-talk@hinv.org wrote: > Hi Matt, > > As you suggested I put the "poll_message"-div + JS-code + periodically_... > inside a partial rendered at startup. > > I also got rid of the RJS-template in exchange for your "respond_to" thing > But here is the thing: > my io_process-method looks sort of like this: > > def io_method > session[:message] = "starting io..." > # ... > if (blah) > session[:message] = "finished" > else > session[:message] = "an error occurred!" > end > respond_to do |format| > format.js { render :update do |page| > page.insert_html :bottom, 'poll_message', :partial => 'message' > end > } > session[:message] = nil > end > > my partial "_message.rhtml" just calls "<%= session[:message] %>" > > So when the interpreter gets to "respond_to", > it only renders the last message defined by the io_method. > > Also the message is rendered after io_method is done. > So I am actually where I started from: > the template messages get rendered after the controller method is done. > > Thanks for your help! > > Cheers, > Tom. > > --------------------------------- > On Mon, 2 Apr 2007 19:57:54 +0900 > "Matthieu Stone" wrote: > > > 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. > > > > > > > > > > > > -- http://www.jeremymcanally.com/ My free Ruby e-book: http://www.humblelittlerubybook.com/book/ My blogs: http://www.mrneighborly.com/ http://www.rubyinpractice.com/