Rails: преобразование строки в переменную (для хранения значения) - PullRequest
1 голос
/ 25 сентября 2011

У меня есть хэш параметра, который содержит разные пары переменных и имен, такие как:

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

У меня также есть объект CalculationValidator, который является не ActiveRecord, но ActiveModel :: Validations. Объект проверяет различные типы ввода из форм. Таким образом, он не имеет определенного набора переменных.

Я хочу создать объект для проверки его следующим образом:

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

validator.valid?

Моя проблема сейчас заключается в том, что я действительно не предпочел бы кодировать каждый CalculationValidator вручную, а использовал бы информацию из хэша. Здесь есть вся информация, поэтому я хотел бы сделать что-то вроде этого, где 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» в переменной validator.person_height , которую я могу использовать для хранения числа 5?

Кроме того, очень важно, чтобы значения param_pair [1] сохранялись как их действительные форматы (целое число, строка и т. Д.), Поскольку они будут проверены.

Я пробовал .send () и instance_variable_set, но я не уверен, что они справятся.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Нечто подобное может работать для вас:

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

Однако вы можете заметить, что здесь нет кастинга или чего-то еще.Вам нужно будет сообщить, какой тип значения у каждого есть, так как нельзя предположить, что «5» должен быть целым числом, например.

И, конечно, у меня, вероятно, нетОтметим, что оценка входных данных, поступающих из формы, не совсем безопасная вещь в мире, поэтому вам придется подумать о том, как вы хотите с этим справиться.

0 голосов
/ 25 сентября 2011

Вы смотрели на eval .Пока вы можете доверять входным данным, все должно быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...