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 -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 12 May 2011, at 13:19, Sebastian wrote:> 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!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 -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
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 On 12 Mai, 14:41, Peter De Berdt <peter.de.be...-LPO8gxj9N8aZIoH1IeqzKA@public.gmane.org> wrote:> On 12 May 2011, at 13:19, Sebastian wrote: > > > > > > > > > > > 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! > > 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 athttp://railscasts.com > on this subject) > > Best regards > > Peter De Berdt-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
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... On 12 Mai, 17:12, Sebastian <sebastian.go...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:> 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 > > On 12 Mai, 14:41, Peter De Berdt <peter.de.be...-LPO8gxj9N8aZIoH1IeqzKA@public.gmane.org> wrote: > > > > > > > > > On 12 May 2011, at 13:19, Sebastian wrote: > > > > 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! > > > 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 athttp://railscasts.com > > on this subject) > > > Best regards > > > Peter De Berdt-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.