Ваш оригинальный код работает на меня. Во всяком случае, вот еще один способ написать это:
def attr_addr(target, attr)
target.instance_eval "attr_accessor :#{attr}"
end
Вот оно в действии в сеансе IRB:
>> bob = Person.new
=> #<Person:0x00000000df8798>
>> bob.name = "bob"
NoMethodError: undefined method `name=' for #<Person:0x00000000df8798>
from (irb):6
from /home/michi/.rbenv/versions/1.9.3-p0/bin/irb:12:in `<main>'
>> attr_addr(Person, "name")
=> nil
>> bob.name = "bob"
=> "bob"
>> bob
=> #<Person:0x00000000df8798 @name="bob">