我有一个包含不同变量和名称对的参数哈希,例如:
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,但我不确定他们是否会这样做。
答案 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了吗?只要您可以信任输入,就可以使用它。