Удалите все теги html из атрибутов в рельсах
У меня есть модель проекта, и у нее есть некоторые текстовые атрибуты, одна из них - сводка. У меня есть несколько проектов, которые содержат html-теги в сводке, и я хочу преобразовать это в обычный текст. У меня есть этот метод с регулярным выражением, которое удалит все теги html.
def strip_html_comments_on_data
self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>| |\r|\n)/,"")}
end
У меня также есть фильтр before_save
before_save :strip_html_comments_on_data
Проблема заключается в том, что html-теги все еще существуют после сохранения проекта. Что мне не хватает?
И есть ли действительно простой способ вызвать этот метод во всех моделях?
Спасибо,
Николаш Хок Изаза
Ответы
Ответ 1
непроверенных
include ActionView::Helpers::SanitizeHelper
def foo
sanitized_output = sanitize(html_input)
end
где html_input - это строка, содержащая теги HTML.
ИЗМЕНИТЬ
Вы можете разделить все теги, передав :tags=>[]
в качестве опции:
plain_text = sanitize(html_input, :tags=>[])
Несмотря на чтение docs, я вижу, что есть лучший метод:
plain_text = strip_tags(html_input)
Затем сделайте это перед фильтром за smotchkiss, и вам хорошо идти.
Ответ 2
Лучше не включать в свою модель помощников вида. Просто используйте:
HTML::FullSanitizer.new.sanitize(text)
Ответ 3
Просто используйте текстовый помощник strip_tags(), как указано zetetic
Ответ 4
Во-первых, проблема заключается в том, что Array#each
возвращает входной массив независимо от содержимого блока. Несколько человек просто перешли Array#each
со мной в вопрос, который я задал: "Возвращать хэш с измененными значениями в Ruby" .
Во-вторых, Помимо Array#each
, на самом деле вы не делаете то, что хотите здесь, я не думаю, что вы все равно должны это делать. Зачем вам нужно запускать этот метод поверх всех атрибутов модели?
Наконец, почему бы не сохранить HTML-вход от пользователей и просто использовать стандартный h()
помощник при его выводе?
# this will output as plain text
<%=h string_with_html %>
Это полезно, потому что вы можете просматривать базу данных и просматривать немодифицированные данные точно так же, как это было введено пользователем (при необходимости). Если вы действительно должны преобразовать текст в обычный текст перед сохранением значения, вам будет запущено решение @zetetic.
include ActionView::Helpers::SanitizeHelper
class Comment < ActiveRecord::Base
before_save :sanitize_html
protected
def sanitize_html
self.text = sanitize(text)
end
end
Ответ 5
Ссылочный агент Reference Rails непосредственно без использования включает.
def text
ActionView::Base.full_sanitizer.sanitize(html).html_safe
end
ПРИМЕЧАНИЕ. Я добавил .html_safe, чтобы сделать объекты HTML, такие как
, рендерингом правильно. Не используйте это, если есть вероятность для вредоносной инъекции JavaScript.
Ответ 6
Если вы хотите удалить
вместе с тегами html, можно использовать nokogiri
include ActionView::Helpers::SanitizeHelper
def foo
sanitized_output = strip_tags(html_input)
Nokogiri::HTML.fragment(sanitized_output)
end