Как внедрить CDATA с помощью RABL?

#ruby-on-rails #ruby #rabl

#ruby-on-rails #ruby #rabl

Вопрос:

Когда я пытаюсь создать узел, подобный:

   node 'test' do
    '<![CDATA[ <HTML></HTML> ]]>'
  end
  

RABL выводит что-то вроде:

 <test>amp;<![CDATA[ amp;<HTMLamp;>amp;</HTMLamp;> ]]amp;></test>
  

Я бы хотел, чтобы он выводил:

 <test><![CDATA[ <HTML></HTML> ]]></test>
  

Как это сделать?

Комментарии:

1. <![CDATA[ <HTML></HTML> ]]> Как RABL узнает, что вы хотите, при написании <HTML></HTML> (CDATA — это специальный блок) или обычная строка <![CDATA[ <HTML></HTML> ]]> (CDATA — это часть ответа)? Я думаю, вам не следует (и не нужно) писать блок CDATA самостоятельно. RABL создает API для обмена данными в разных клиентах. API может быть недоступен для чтения человеком, но для программы это нормально. Просто напишите <HTML></HTML> и позвольте RABL экранировать специальные символы для вас.

Ответ №1:

Средство визуализации XML в Rabl Hash#to_xml использует внутри ActiveSupport, поэтому вы можете использовать функциональность этой функции для генерации блока CDATA, подобного этому:

 node 'test' do
  { '_' => lambda { |x| x[:builder].cdata! '<HTML></HTML>' } }
end
  

Обратите внимание, что я добавил «одноразовый» ключ, поскольку to_xml переданный ключ выбрасывается для процедуры. Взгляните на исходный код по ссылке выше; возможно, есть лучший способ справиться с этим.

Rabl отображает приведенный выше блок для меня следующим образом:

 <?xml version="1.0" encoding="UTF-8"?>
<hash>
  <test>
    <![CDATA[<HTML></HTML>]]>
  </test>
</hash>