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 %>
В настоящий момент он отображает текст следующим образом:
<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"></iframe>
Мне нужно отобразить его как 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) %>