2010-04-05 10 views
11

Tengo un modelo de proyecto y tiene algunos atributos de texto, uno es un resumen. Tengo algunos proyectos que tienen etiquetas html en el resumen y quiero convertir eso en texto sin formato. Tengo este método que tiene una expresión regular que eliminará todas las etiquetas html.Eliminar todas las etiquetas html de los atributos en los raíles

def strip_html_comments_on_data 
    self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")} 
end 

que también tienen un filtro before_save

before_save :strip_html_comments_on_data 

El problema es que las etiquetas HTML están todavía allí después de guardar el proyecto. ¿Qué me estoy perdiendo?

Y, ¿hay una manera realmente fácil de tener ese método llamado en todos los modelos?

Gracias,

Nicolás Hock Isaza

+2

No soy un usuario rubí, pero no parece haber ninguna asignación que ocurre allí. Estás calculando una cadena con esas cosas desmanteladas, pero no guardando eso en ninguna parte. – Yuliy

+0

@Yuliy ruby ​​tiene cadenas mutables! (gsub! es la forma mutable de gsub - ick!) !!! (para una buena medida) !!! (y +1 por hacerme ver más difícil) –

Respuesta

44

no probado

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

donde html_input es una cadena que contiene etiquetas HTML.

EDITAR

Puede quitar todas las etiquetas pasando :tags=>[] como una opción:

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

Aunque la lectura de la docs Veo que hay un método mejor:

plain_text = strip_tags(html_input)

Luego, conviértalo en un filtro anterior por smotchkiss y listo.

+0

No quiero desinfectarlo. Quiero eliminarlos. Si tengo hola Quiero guardar solo hola – Hock

+0

ver la versión editada – zetetic

+0

¡Sí! él strip_tags es la mejor manera de hacerlo. ¡Gracias! – Hock

1

En primer lugar, el problema aquí es que Array#each devuelve la matriz de entrada independientemente del contenido del bloque. Un par de personas simplemente se acercaron a Array#each conmigo en una pregunta que hice: "Return hash with modified values in Ruby".

En segundo lugar, aparte de Array#each haciendo realmente lo que no quiere hacer aquí, no creo que de todos modos deba hacer esto. ¿Por qué necesitaría ejecutar este método en ALL los atributos del modelo?

Finalmente, ¿por qué no conservar la entrada de HTML de los usuarios y simplemente usar el ayudante estándar h() al realizar la salida?

# this will output as plain text 
<%=h string_with_html %> 

Esto es útil porque se puede ver la base de datos y ver los datos sin modificar tal y como fue introducida por el usuario (si es necesario). Si realmente debe convertir a texto sin formato antes de guardar el valor, la solución de @ zetetic lo iniciará.

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

    protected 
    def sanitize_html 
    self.text = sanitize(text) 
    end 

end 
4

sólo tiene que utilizar los strip_tags (texto) de ayuda según lo mencionado por Zetetic

10

Sería mejor no incluir ayudantes de vista del modelo.Simplemente use:

HTML::FullSanitizer.new.sanitize(text) 
1

Referencia Rails 'sanitizer directamente sin usar includes.

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

NOTA: Me adjuntas .html_safe para que las entidades HTML como &nbsp; representan correctamente. No use esto si existe la posibilidad de inyección de JavaScript malicioso.

0

Si desea eliminar &nbsp; junto con etiquetas html, nokogiri puede usarse

include ActionView::Helpers::SanitizeHelper 

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