2010-04-05 10 views
11

Ich habe ein Projektmodell und es hat einige Textattribute, eins ist eine Zusammenfassung. Ich habe einige Projekte, die HTML-Tags in der Zusammenfassung haben, und ich möchte das in einfachen Text konvertieren. Ich habe diese Methode, die eine Regex hat, die alle HTML-Tags entfernen wird.Entfernen Sie alle HTML-Tags aus Attributen in Schienen

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

Ich habe auch ein BEFORE_SAVE Filter

before_save :strip_html_comments_on_data 

Das Problem ist, dass die HTML-Tags gibt es immer noch nach dem Speichern des Projekts. Was vermisse ich?

Und, gibt es einen wirklich einfachen Weg, diese Methode in allen Modellen genannt zu haben?

Danke,

Nicolás Hock Isaza

+2

ich einen Rubin Benutzer ist nicht verwendet werden, aber es scheint nicht dort auftretenden jede Zuordnung zu sein. Sie berechnen eine Zeichenkette mit diesen ausgeschnittenen Dingen, speichern diese aber nirgendwo. – Yuliy

+0

@Yuliy Ruby hat veränderliche Saiten! (gsub! ist die veränderbare Form von gsub - ick!) !!! (für ein gutes Maß) !!! (und +1, damit ich es härter ansehe) –

Antwort

44

ungetestet

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

wo html_input ein String HTML-Tags enthalten ist.

EDIT

Sie können alle Tags Streifen von :tags=>[] Gabe als Option:

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

Obwohl die docs Lesen ich sehe, gibt es eine bessere Methode:

plain_text = strip_tags(html_input)

Dann mach es zu einem Vorfilter per smotchkiss und du bist gut zu gehen.

+0

Ich möchte es nicht sanieren. Ich möchte sie entfernen. Wenn ich Hallo habe Ich möchte nur Hallo speichern – Hock

+0

siehe bearbeitete Version – zetetic

+0

Yeah! Er strip_tags ist der beste Weg zu gehen. Vielen Dank! – Hock

1

Zuerst ist das Problem hier, dass Array#each das Eingabearray unabhängig vom Blockinhalt zurückgibt. Ein paar Leute sind gerade über Array#each mit mir in einer Frage gegangen, die ich fragte: "Return hash with modified values in Ruby".

Zweitens, abgesehen von Array#each nicht wirklich tun, was Sie wollen, dass es hier, ich glaube nicht, dass Sie das tun sollten sowieso. Warum müssten Sie diese Methode über ALL die Attribute des Modells ausführen?

Schließlich, warum nicht halten Sie die HTML-Eingabe von den Benutzern und einfach die Standard h() Helfer bei der Ausgabe verwenden?

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

Dies ist nützlich, weil Sie die Datenbank anzeigen können und die unveränderten Daten genau sehen, wie sie vom Benutzer eingegeben wurde (falls erforderlich). Wenn Sie vor dem Speichern des Werts wirklich in reinen Text konvertieren müssen, können Sie mit der Lösung von @ zetetic beginnen.

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

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

end 
4

verwenden Sie einfach die strip_tags() Text Helfer von zetetic erwähnt als

10

wäre es besser, nicht View Helfer in Ihrem Modell aufzunehmen.Verwenden Sie einfach:

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

Reference Rails 'Desinfektionsmittel direkt ohne Verwendung enthält.

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

HINWEIS: Ich .html_safe angefügt HTML-Entitäten wie &nbsp; richtig machen zu machen. Verwenden Sie diese Option nicht, wenn eine schädliche JavaScript-Injektion möglich ist.

0

Wenn Sie &nbsp; zusammen mit HTML-Tags entfernen möchten, kann nokogiri

include ActionView::Helpers::SanitizeHelper 

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