From: Joe Van Dyk Date: 2005-04-30T03:15:45+09:00 Subject: Re: method_missing question On 4/29/05, Joe Van Dyk wrote: > On 4/29/05, Joe Van Dyk wrote: > > On 4/29/05, Rick Olson wrote: > > > Why not just call @display.zoom(500)? > > > > > > On 4/29/05, Joe Van Dyk wrote: > > > > Currently, I have a class that has a bunch of methods (that a GUI does > > > > a callback on) that are like > > > > > > > > def menu_zoom_100_activate > > > > @display.zoom(100) > > > > end > > > > > > > > def menu_zoom_250_activate > > > > @display.zoom(250) > > > > end > > > > > > > > def menu_zoom_500_activate > > > > @display.zoom(500) > > > > end > > > > > > > > Could I use #method_missing to make this better? > > > > > > > > Because when a GUI button is clicked, I need to call a particular > > method of a particular class. I don't think I can give it an > > argument. > > > > Actually, (I'm using Glade) I have this: > > app_window = AppWindow.new > GladeXML.new("app.glade") { |handler| app_window.method(handler) } > > Where AppWindow is a class that contains all the methods that are > defined in the glade file. In the glade file are methods being > registered like "menu_zoom_250_activate", "menu_zoom_500_activate" and > so on. > > If a particular method that's contained in the glade file isn't > defined in the AppWindow class, I get a "undefined method ' method>' for class AppWindow" upon the start of the application. > > I added AppWindow#method_missing that just prints out the missing > method, but that didn't seem to solve anything. > > Perhaps it would be best to have a single method in AppWindow that > took all the methods (as a string) that were defined in the glade file > and executed the appropriate action? > > So, > > GladeXML.new("app.glade") { |handler| app_window.execute_method(handler) } > > class AppWindow > def execute_method(method) > case method > when /menu_zoom_(\d+)_activate/ > @display.zoom($1.to_i) > when "something_else" > # do something else > end > end > end > Nuts, I tried that, and AppWindow#execute_method is being run at application start for each method defined in the glade file, and now none of the GUI events do anything. Hm.