Stefano Crocco
5/30/2007 9:02:00 AM
Alle mercoledì 30 maggio 2007, Maurice Gladwell ha scritto:
> It seems Object#respond_to doesn't work for dynamically generated
> methods:
>
> SomeRailsModel.respond_to? 'find_by_name' #=> false
>
> 1. Is there some way to *really* check if an object will respond to a
> message, even if it will respond by a dynamically generated method?
>
> Right now, Object#respond_to? just doesn't do what it name promises: it
> doesn't check if an object responds to a message :foo, only if the
> object has a :foo method defined.
>
> Thanks,
> Maurice B. Gladwell
Are you sure find_by_name is a class method and not an instance method (i.e,
do you call SomeRailsModel.find_by_name or something like
SomeRailsModel.new.find_by_name)? I don't know Rails, so I may be wrong, but
to me it seems that find_by_name is an instance method. If it is so, then you
can't expect SomeRailsModel.respond_to? to return true. This has nothing to
do with the method being dynamically generated. For instance,
Array.respond_to?(:select)
gives false, because select is an instance method.
Array.new.respond_to?(:select)
gives true, instead.
If you want to know whether a class has an *instance* method without first
creating an instance of the class, you can call instance_methods on the
class. It will return an array with the names of the methods instances of the
class will have. For example:
Array.instance_methods
=>["select", "[]=", "inspect", "<<", ... ]
In your case, if find_by_name is an instance method, you can do this:
SomeRailsModel.instance_methods.include? 'find_by_name'
I hope this helps
Stefano