Strange class_eval behavior

hi again, all.
I have the following plugin included in my active record model.
What i’d like to do, is define a method inside class_eval which returns
the options has that was passed into it via the acts_as_item :foo=>:bar
in my model.

What i’m finding odd is that the self.foo method can access the config
hash when printing it, but not when i try to return it.

puts “OK FOO: #{config[:asset_root]}” - outputs ok, whereas the return
config raises a method or variable not found error.

Any ideas?
best,
paul.

module ClassMethods
  def acts_as_item(options = {})
    include InstanceMethods

    config = {:asset_root=>"SOMEPATH"}
    config.update(options) if options.is_a?(Hash)

    class_eval <<-EOE
      def self.foo
        puts "OK FOO: #{config[:asset_root]}"
        return config
      end
    EOE
  end
end

On Feb 25, 6:28 pm, Paul PH [email protected] wrote:

hi again, all.
I have the following plugin included in my active record model.
What i’d like to do, is define a method inside class_eval which returns
the options has that was passed into it via the acts_as_item :foo=>:bar
in my model.

What i’m finding odd is that the self.foo method can access the config
hash when printing it, but not when i try to return it.

Two very different things are happening: with the puts config is being
resolved just before class_eval is called: the string is interpolated
and the result passed to class_eval.
The return statement on the other hand is evaluated much later - when
the foo method is actually called. config is no longer in scope and so
you get an error.

Fred

Frederick C. wrote:

On Feb 25, 6:28�pm, Paul PH [email protected] wrote:

hi again, all.
I have the following plugin included in my active record model.
What i’d like to do, is define a method inside class_eval which returns
the options has that was passed into it via the acts_as_item :foo=>:bar
in my model.

What i’m finding odd is that the self.foo method can access the config
hash when printing it, but not when i try to return it.

Two very different things are happening: with the puts config is being
resolved just before class_eval is called: the string is interpolated
and the result passed to class_eval.
The return statement on the other hand is evaluated much later - when
the foo method is actually called. config is no longer in scope and so
you get an error.

Fred

Ah, I see - thanks Fred.
I understand the variable is resolved earlier to do the string
interpolation. I do find it odd that it is put into scope for that, but
not for returning it.

Thanks, again.
Paul.