替代eval,用于从字符串中分配模型属性

时间:2014-10-07 12:36:13

标签: ruby ruby-on-rails-4

我正在寻找一种从字符串中分配模型属性的方法。这是在具有不同属性的多个模型之间共享的问题,因此我不能仅对属性名称进行硬编码。

使用带有'send'的字符串检索属性没有问题:

self.send("#{attribute_name}")

但是我很难从字符串中分配属性。 E.g

self."attribute_name" = "<user input>"

可怕的评估功能可以满足我的需要,但显然非常不安全:

eval("self.#{attribute_name} = '<user input>'")

我是否缺少可以在没有eval的情况下实现此功能的功能?或者我的方法都错了,我应该回到绘图板?感谢。

2 个答案:

答案 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)