Вы можете использовать метод #send для вызова метода объекта по имени метода:
object.send(:foo) # same as object.foo
Вы можете передавать аргументы вызываемому методу:
object.send(:foo, 1, "bar", 1.23) # same as object.foo(1, "bar", 1.23)
Итак, если у вас есть имя атрибута в переменной "attribute", вы можете прочитать атрибут объекта с помощью
object.send(attribute.to_sym)
и запишите значение атрибута с
object.send("#{attribute}=".to_sym, value)
В Ruby 1.8.6 метод #send может выполнять любой метод объекта независимо от его видимости (вы можете, например, вызывать закрытые методы). Это может измениться в будущих версиях Ruby, и вы не должны на это полагаться. Для выполнения приватных методов используйте #instance_eval:
object.instance_eval {
# code as block, can reference variables in current scope
}
# or
object.instance_eval <<-CODE
# code as string, can generate any code text
CODE
Обновление
Вы можете использовать public_send
для вызова методов с учетом правил видимости.
object.public_send :public_foo # ok
object.public_send :private_bar # exception