我正在寻找一种从字符串中分配模型属性的方法。这是在具有不同属性的多个模型之间共享的问题,因此我不能仅对属性名称进行硬编码。
使用带有'send'的字符串检索属性没有问题:
self.send("#{attribute_name}")
但是我很难从字符串中分配属性。 E.g
self."attribute_name" = "<user input>"
可怕的评估功能可以满足我的需要,但显然非常不安全:
eval("self.#{attribute_name} = '<user input>'")
我是否缺少可以在没有eval的情况下实现此功能的功能?或者我的方法都错了,我应该回到绘图板?感谢。
答案 0 :(得分:1)
如果该属性具有公共setter方法,则可以:
class X
attr_accessor :foo
def dynamic_set(attr_name, value)
public_send("#{attr_name}=", value)
end
end
x = X.new
x.dynamic_set("foo", "bar")
p x.foo
# => "bar"
答案 1 :(得分:1)
您应该将它们保存为实例变量。
获得:
instance_variable_get("@#{attribute_name}")
设置:
instance_variable_set("@#{attribute_name}", user_input)