Lighthouse has a new layout. Prefer the old one? Return to the old layout, and switch back any time from the link at the top of each page.

This project is archived and is in readonly mode.

AR Association Proxy prevents calling methods defined using method_missing on the target of the association

#3481

From the commit:

Don't raise a NoMethodError if the target does not respond_to? method. This excludes methods on target that are implemented using method_missing. And if the method really doesn't exist, target.send(method, args) will raise a NoMethodError itself...so let it do that.

Description:

If I have a model like this:

class User < ActiveRecord::Base
# Provide is_admin?, is_guest? account type discovery methods def method_missing(method_id, *arguments)

if match = /^is_(\w+)\?$/.match(method_id.to_s)
  self.account_type == match[1]
else
  super
end

end end

class Activity < ActiveRecord::Base
belongs_to :user end

I can't do Activity.first.user.is_guest? because it raises a NoMethodError. The problem is that the Association Proxy only allows calling methods on the target that respond_to?(method). It doesn't need to do this check, because if the method really doesn't exist, the call to target.send(method, args) will raise NoMethodError itself, so nothing is gained by doing that check in the proxy.

Reported by Karl Varga · November 11th, 2009 @ 08:26 AM

State: invalid
Milestone: none
Assigned to: nobody
Importance: none

Activity

  1. Michael Koziarski
    Michael Koziarski
    • State changed from new to invalid

    If you override method_missing you must also override respond_to?

    The check is there to prevent calling private methods.

    November 19th, 2009 @ 03:24 AM