Skip to content

Commit

Permalink
Fix instance_eval calls to association proxies
Browse files Browse the repository at this point in the history
In the current stable, ActiveRecord::Associations::AssociationProxy#method_missing calls yield() if a block is given, causing the block to always be evaluated in its calling context. However, in the case of instance_eval, correct behavior requires that the block be passed directly to the @target, rather than being evaluated inside a different block. Incidentally, this also simplifies the code slightly.

[#3412 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
  • Loading branch information
Mat Brown authored and jeremy committed Dec 2, 2009
1 parent 50c28e7 commit 49e943c
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
Expand Up @@ -200,18 +200,14 @@ def with_scope(*args, &block)

private
# Forwards any missing method call to the \target.
def method_missing(method, *args)
def method_missing(method, *args, &block)
if load_target
unless @target.respond_to?(method)
message = "undefined method `#{method.to_s}' for \"#{@target}\":#{@target.class.to_s}"
raise NoMethodError, message
end

if block_given?
@target.send(method, *args) { |*block_args| yield(*block_args) }
else
@target.send(method, *args)
end
@target.send(method, *args, &block)
end
end

Expand Down
Expand Up @@ -1178,5 +1178,13 @@ def test_creating_using_primary_key
client = firm.clients_using_primary_key.create!(:name => 'test')
assert_equal firm.name, client.firm_name
end

def test_normal_method_call_in_association_proxy
assert_equal 'Welcome to the weblog', Comment.all.map { |comment| comment.post }.first.title
end

def test_instance_eval_in_association_proxy
assert_equal 'Welcome to the weblog', Comment.all.map { |comment| comment.post }.first.instance_eval{title}
end
end

0 comments on commit 49e943c

Please sign in to comment.