Как то так?
def build_xml(node_name, node_list)
xml.send(node_name.pluralize) do
node_list.each do |node|
id_str = node["#{node_name}_id"]
name_str = node["#{node_name}_name"]
xml.send(node_name, :id => id_str, :name => name_str)
end
end
end
build_xml("role", @roleslist)
build_xml("level", @levelslist)
Я пытаюсь использовать send
вместо eval
[что я плохо сделал: отредактировал, чтобы исправить - спасибо Кэти Ван Стоун].
Редактировать 26/12, потому что построитель xml захватит отправку и использует ее как ветку xml. Существует два возможных варианта, вместо этого используйте метод send , например,
xml.__send__(node_name, :id => id_str, :name => name_str)
но я не уверен, что он создаст <__send__:roles>
. Вы всегда можете вернуться к
eval("xml.#{node_name} :id => '#{id_str}', :name => '#{name_str}'")
, который обязательно должен работать (но eval
всегда следует использовать в крайнем случае).