Rails:将字符串转换为变量(以存储值)

时间:2011-09-25 18:43:03

标签: ruby-on-rails string variables send

我有一个包含不同变量和名称对的参数哈希,例如:

param_hash = {"system_used"=>"metric", "person_height_feet"=>"5"}

我还有一个对象CalculationValidator,它是一个ActiveRecord而是一个ActiveModel :: Validations。 Object验证表单中不同类型的输入。因此,它没有一组特定的变量。

我想创建一个Object来验证它:

validator = CalculationValidator.new()
validator.system_used = "metric"
validator.person_height_feet = 5

validator.valid?

我现在的问题是我真的不想手动编写每个CalculationValidator,而是使用Hash中的信息。信息就在那里,所以我想做的就是这样,MAKE_INTO_VARIABLE()是我正在寻找的功能。

validator = CalculationValidator.new()
param_hash.each do |param_pair|
  ["validator.", param_pair[0]].join.MAKE_INTO_VARIABLE() = param_pair[1]
  # thus creating
  # "validator.system_used".MAKE_INTO_VARIABLE() = "metric"
  # while wanting: validator.system_used = "metric"
  # ...and in the next loop
  # "validator.person_height_feet".MAKE_INTO_VARIABLE() = 5
  # while wanting: validator.person_height_feet = 5
end

validator.valid?

问题: 基本上我的问题是,如何将字符串“validator.person_height”变成我可以用来存储数字5的变量 validator.person_height

此外,将param_pair [1]的值存储为真实格式(整数,字符串等)非常重要,因为它们将被验证。

我尝试过.send()和instance_variable_set,但我不确定他们是否会这样做。

2 个答案:

答案 0 :(得分:1)

这样的事可能适合你:

param_hash.each do |param, val|
  validator.instance_eval("def #{param}; @#{param} end")
  validator.instance_variable_set("@#{param}", val)
end

但是,您可能会注意到此处没有任何投射或任何内容。你需要以某种方式传达每种类型的值,因为不能假设“5”应该是一个整数,例如。

当然我可能不必提及,从表单中获取的eval'输入并不是世界上最安全的东西,所以你必须考虑如何处理这个问题

答案 1 :(得分:0)

你看过eval了吗?只要您可以信任输入,就可以使用它。