This comes up again and again.  You might want to search the archives.

Short story: Ruby determines local variables at parse time.  Although you
can bind values to local vars with eval you cannot access them outside of
eval because they are not known there:

14:44:40 [source]: ruby -e 'eval("x=10");p(eval("x"))'
10
14:44:46 [source]: ruby -e 'eval("x=10");p x'
-e:1: undefined local variable or method `x' for main:Object (NameError)
14:44:51 [source]: ruby -e 'x=nil;p x;eval("x=10");p x'
nil
10

Apart from that: your dynamic created variables will be of no use as the
method body cannot access them.  The simplest solutions:

 1) Access the hash instead of using local vars

 2) Generate the complete method code

In any case: make sure you have default values so you can init variables
not defined in the hash.  Otherwise you'll see the same error:

14:48:05 [source]: ruby -e 'def x(a) b + a end;x 10'
-e:1:in `x': undefined local variable or method `b' for main:Object
(NameError)
        from -e:1

Kind regards

    robert