В своей работе вам наверняка приходится сталкиваться с множеством технических проблем. Некоторые из них отнимают много времени, другие решаются быстро. Иногда вы сталкиваетесь с очень хорошо понятными и потенциально легко решаемыми проблемами… но в итоге вы видите, что потратили уйму часов на поиск решения, которое должно было занять меньше часа.
Итак… как насчет модификации JSON? Легко или сложно это сделать в Ruby (& Rails)?
Предположим, что у нас есть простая структура с HTML-фрагментами внутри:
{
"a": {
"b": [
{
"c": "<span id="head"></span>"
},
{
"d": "<span id="body"></span>"
}
],
"e": "#ffffff"
},
"f": "<span id="footer"></span>",
"g": 123
}
и у нас есть список переменных, например:
head = "Hey John!"
body = "I invite you to my Birthday party!"
footer = "Best regards."
Наша цель — найти определенные фрагменты DOM в этом дереве и внедрить текст. Другие значения не могут быть изменены. Поэтому в конце мы получим что-то вроде этого.
{
"a": {
"b": [
{
"c": "<span id="head">Hey John!</span>"
},
{
"d": "<span id="body">I invite you to my Birthday party!</span>"
}
],
"e": "#ffffff"
},
"f": "<span id="footer">Best regards.</span>",
"g": 123
}
Похоже, что решение довольно простое. Вы можете преобразовать его в хэш и использовать метод deep_transform_values в сочетании с гемом nokogiri.
hash.deep_transform_values { |value|
if value.is_a?(String)
html = Nokogiri::HTML5.fragment(value)
head_node = html.at_css("#head")
body_node = html.at_css("#body")
footer_node = html.at_css("#footer")
head_node&.inner_html = head
body_node&.inner_html = body
footer_node&.inner_html = footer
html.to_s
else
value
end
}
… и это все.