Удалите все теги html из атрибутов в рельсах

У меня есть модель проекта, и у нее есть некоторые текстовые атрибуты, одна из них - сводка. У меня есть несколько проектов, которые содержат html-теги в сводке, и я хочу преобразовать это в обычный текст. У меня есть этот метод с регулярным выражением, которое удалит все теги html.

def strip_html_comments_on_data
  self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\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, такие как &nbsp;, рендерингом правильно. Не используйте это, если есть вероятность для вредоносной инъекции JavaScript.

Ответ 6

Если вы хотите удалить &nbsp; вместе с тегами html, можно использовать nokogiri

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = strip_tags(html_input)
  Nokogiri::HTML.fragment(sanitized_output)
end