Удалить все HTML-теги из атрибутов в рельсах - PullRequest
12 голосов
/ 05 апреля 2010

У меня есть модель проекта, и у нее есть некоторые текстовые атрибуты, один из которых является сводным. У меня есть несколько проектов, которые содержат 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-теги остаются после сохранения проекта. Чего мне не хватает?

И есть ли действительно простой способ вызвать этот метод во всех моделях?

Спасибо

Николас Хок Исаза

Ответы [ 6 ]

45 голосов
/ 05 апреля 2010

не проверено

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = sanitize(html_input)
end

где html_input - строка, содержащая теги HTML.

РЕДАКТИРОВАТЬ

Вы можете удалить все теги, передав :tags=>[] как вариант:

plain_text = sanitize(html_input, :tags=>[])

Хотя при чтении документов я вижу, что есть лучший метод:

plain_text = strip_tags(html_input)

Затем добавьте фильтр до smotchkiss и все готово.

10 голосов
/ 08 ноября 2012

Было бы лучше не включать помощников вида в вашу модель. Просто используйте:

HTML::FullSanitizer.new.sanitize(text)
3 голосов
/ 06 апреля 2010

Просто используйте текстовый помощник strip_tags (), как упомянуто zetetic

1 голос
/ 04 августа 2013

Дезинфицирующее средство Reference Rails напрямую без использования включает.

def text
  ActionView::Base.full_sanitizer.sanitize(html).html_safe
end

ПРИМЕЧАНИЕ. Я добавил .html_safe, чтобы объекты HTML типа &nbsp; отображались правильно. Не используйте это, если есть вероятность вредоносного внедрения JavaScript.

1 голос
/ 05 апреля 2010

Во-первых, проблема в том, что Array#each возвращает входной массив независимо от содержимого блока. Пара человек только что обсудили со мной вопрос Array#each: "Вернуть хеш с измененными значениями в Ruby" .

Во-вторых, кроме того, что Array#each на самом деле не делает то, что вы хотите здесь, я не думаю, что вы все равно должны это делать. Зачем вам нужно запускать этот метод для ALL атрибутов модели?

Наконец, почему бы не сохранить ввод 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
0 голосов
/ 25 сентября 2013

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

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = strip_tags(html_input)
  Nokogiri::HTML.fragment(sanitized_output)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...