ruby on rails - Check if method defined on mixee class? -


we have module handle canceling models. it's clean, works nice, we've run in issue class want mix in has our module methods (cancel!, etc) defined.

we tried come new names avoid collisions, seems less-than-ideal, , cleanness of calling cancel!. so, we've decided want like:

def cancel!   cancelly_stuff   if class.parent.respond_to(:cancel!) super end 

however, it's module, class we're mixing in not class.parent. unable google how reference mixee-class of module.

i come answer post, using prepend instead of include (only ruby 2.x). first including @ top of ancestry chain, since second goes after class.

let see how works @ irb console:

~/rails/learn/ruby (main) > module ~/rails/learn/ruby (main) |   def cancel! ~/rails/learn/ruby (main) |     puts 'cancel m:a' ~/rails/learn/ruby (main) |     super if defined? super ~/rails/learn/ruby (main) |   end   ~/rails/learn/ruby (main) | end   => :cancel! ~/rails/learn/ruby (main) > class c ~/rails/learn/ruby (main) |   prepend ~/rails/learn/ruby (main) |   def cancel! ~/rails/learn/ruby (main) |     puts 'cancel c:c' ~/rails/learn/ruby (main) |   end   ~/rails/learn/ruby (main) | end   => :cancel! ~/rails/learn/ruby (main) > c.ancestors => [     [0] #<class:0x000000035421f0>::a,     [1] #<class:0x000000035421f0>::c < object,     [2] object < basicobject,     [3] pp::objectmixin,     [4] kernel,     [5] basicobject ] ~/rails/learn/ruby (main) > c.new.cancel! cancel m:a cancel c:c => nil ~/rails/learn/ruby (main) > class d ~/rails/learn/ruby (main) |   include ~/rails/learn/ruby (main) |   def cancel! ~/rails/learn/ruby (main) |     puts 'cancel c:d' ~/rails/learn/ruby (main) |     super if defined? super ~/rails/learn/ruby (main) |   end   ~/rails/learn/ruby (main) | end   => :cancel! ~/rails/learn/ruby (main) > d.ancestors => [     [0] #<class:0x000000035421f0>::d < object,     [1] #<class:0x000000035421f0>::a,     [2] object < basicobject,     [3] pp::objectmixin,     [4] kernel,     [5] basicobject ] ~/rails/learn/ruby (main) > d.new.cancel! cancel c:d cancel m:a => nil 

i hope helps issue.


Comments

Popular posts from this blog

c++ - Delete matches in OpenCV (Keypoints and descriptors) -

java - Could not locate OpenAL library -

sorting - opencl Bitonic sort with 64 bits keys -