Unescaping строка HTML

Унаследована следующая строка (я ничего не могу сказать о формате):

 <iframe \n  class=\"some_class\"\n  type=\"text/html\" \n  src=\"/embed/iframe_content.html?id=tsqA5D7_z10\" \n  width=\"960\" \n  height=\"593\" \n  marginwidth=\"0\" \n  marginheight=\"0\" \n  frameborder=\"0\">\n</iframe>

Я рисую его в шаблоне erb следующим образом:

<%= the_string %>

В настоящий момент он отображает текст следующим образом:

&lt;iframe  class="some_class" type="text/html" src="/embed/iframe_content.html?id=tsqA5D7_z10" width="960" height="593"  marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;

Мне нужно отобразить его как HTML.

Я пробовал следующее:

  • <%= the_string.html_safe %> # Возвращает строку без изменений
  • <%= CGI.unescapeHTML(the_string) %> # Ошибки с ошибкой типа "не могут дублировать NilClass
  • <%= CGI.unescapeHTML(the_string).html_safe %> # Ошибки с ошибкой типа 'не может дублировать NilClass
  • <%= raw the_string %> # Возвращает строку без изменений

Как я могу отобразить эту строку как HTML?

Ответ 1

Как вы, кажется, заметили, вам нужно позаботиться о двух вещах:

  • Unescaping объектов HTML
  • Печать исходного HTML-кода в вашем представлении

Для числа 2 <%= raw ... %> должно работать нормально.

Для числа 1 CGI.unescapeHTML была правильная идея, но я не думаю, что она распознает все элементы HTML, поэтому я бы рекомендовал взглянуть на HTML Entites gem

Вы также можете попробовать использовать вспомогательный метод simple_format, но я думаю, вам придется передать ему некоторые варианты для него чтобы разрешить тег <iframe>

также я бы настоятельно предложил переместить вашу логику unescaping в вспомогательный метод.

Ответ 2

то, что вы не скрываете, не должно быть строкой, и поэтому вы получаете ошибки с ошибкой типа can't dup NilClass

Попробуйте сделать s = String.new your_obj.to_s

Теперь сделаем

CGI.unescapeHTML(s)

Ответ 3

В конце концов мне пришлось использовать HTMLEntities Gem, предложенный Мэтью;

  • Установил драгоценный камень с RVM и добавил его в мой Gemfile

  • Требуется его в моем приложении .rb

  • Единственное, что я мог сделать, это сделать правильно. Обратите внимание на дополнительные одинарные кавычки, обернутые вокруг the_string. Без них угловые скобки не отображаются, хотя все остальное делает.

    coder = HTMLEntities.new
    raw coder.decode("'"+the_string+"'")
    

Ответ 4

Вы можете попробовать следующее:

<%= raw the_string %>

Ответ 5

Версия 3 звучит ценно. Любая причина, по которой вы не используете the_string?

<%= raw CGI.unescapeHTML(the_string) %>