Рендеринг безопасного HTML в Rails 3 - PullRequest
1 голос
/ 26 января 2012

У меня есть база данных, заполненная старыми сообщениями в блоге, которые я пытаюсь перенести в Rails.Поле body состоит из сообщений, которые выглядят в формате, подобном следующему:

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text.

<iframe src="http://www.youtube.com?v=XXXXXXXX" width="400" height="250"></iframe>

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text.

<ul>
<li>List item</li>
<li>List item</li>
<li>List item</li>
<li>List item</li>
</ul>

Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text. Paragraph text paragraph text paragraph text and even more paragraph text.

Итак, я пытаюсь заключить текст абзаца в <p>, но оставьте остальные HTML-элементы в покое.Вот что я попробовал:

simple_format (@ post.body) = это помещает <p> вокруг всего, но также загрязняет мои неупорядоченные списки разрывами между каждым элементом списка.Кроме того, встраивание iframe не будет отображаться.

raw (@ post.body) или @post.body.html_safe = Встраивание iframe и неупорядоченные спискиотображаются отлично, но все работает вместе, так как нет замены для новых строк.

simple_format (@ post.body, {}, {: sanitize => false}) = Круто.Теперь я могу видеть все теги HTML!Не работает вообще

@post.body.gsub (/ \ r \ n? /, "<br/>"). Html_safe = Та же проблема, что и с simple_format ...Я получаю разрывы строк в моих тегах блочных элементов html.

Есть предложения о том, как этого добиться?

Ответы [ 3 ]

2 голосов
/ 26 января 2012

Я думаю, что у вас почти это было в вашем последнем примере, но я думаю, что вам нужно сделать .html_safe ранее:

1 голос
/ 14 августа 2014

Я думаю sanitize возможно, что вы хотите

%= sanitize @article.body %>


def sanitize(html, options = {})
  self.class.white_list_sanitizer.sanitize(html, options).try(:html_safe)
end
1 голос
/ 26 января 2012

Я думаю, что ваш вопрос связан не столько с рельсами, сколько с попыткой исправить поврежденный html. В любом случае, ваш пример предполагает, что текст, который должен быть заключен в теги <p>, это строки, которые еще не начинаются с тега. Только вы знаете, относится ли это правило к другим сообщениям.

Попробуй это. Это также учитывает ведущие пробелы.

raw( @post.body.gsub(/^\s*[^<].*/, '<p>\&</p>') )

Если вышесказанное слишком хрупко, я предлагаю использовать Нокогири. Это берет каждый непрерывный блок текста верхнего уровня и переносит его в <p>:

doc = Nokogiri.XML("<body>\n" + @post.body + "\n</body>\n")
doc.root.children.each{|c| c.text? and c.replace("<p>#{c.to_s.strip}</p>") }
raw( doc.root.inner_html )

Чтобы вставить <br> s в разрывы строк в текстовых блоках, вы можете заменить c.to_s.strip выше на c.to_s.strip.gsub(/\r?\n/, "<br/>\n").

Я заметил, что ваш вопрос был /\r\n?/. Вы когда-нибудь ожидали возврата каретки старого Mac OS (\r) сами? Если вы хотите работать с Windows или Unix, вы должны использовать /\r?\n/.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...