2010-04-05 16 views
11

Ho un modello di progetto e ha alcuni attributi di testo, uno è riepilogo. Ho alcuni progetti con tag html nel sommario e voglio convertirlo in testo normale. Ho questo metodo che ha una regex che rimuoverà tutti i tag html.Rimuovi tutti i tag html dagli attributi nei binari

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

Ho anche un filtro before_save

before_save :strip_html_comments_on_data 

Il problema è che i tag HTML sono ancora lì dopo aver salvato il progetto. Cosa mi manca?

E, c'è un modo davvero semplice per avere quel metodo chiamato in tutti i modelli?

Grazie,

Nicolás Hock Isaza

+2

Io non sono un utente rubino, ma non sembra essere qualsiasi incarico che vi si manifestano. Stai calcolando una stringa con quelle cose spogliate, ma non salvandole da nessuna parte. – Yuliy

+0

@Yyyy ruby ​​ha stringhe mutabili! (gsub! è la forma mutevole di gsub - ick!) !!! (per buona misura) !!! (e +1 per avermi fatto vedere più difficile) –

risposta

44

non testato

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

dove html_input è una stringa contenente tag HTML.

EDIT

È possibile togliere tutti i tag passando :tags=>[] come opzione:

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

Anche se la lettura del docs vedo c'è un metodo migliore:

plain_text = strip_tags(html_input)

Quindi trasformalo in un filtro precedente per smotchkiss e sei a posto.

+0

Non voglio sanitizzarlo. Voglio rimuoverli. Se ho ciao Voglio memorizzare solo ciao – Hock

+0

vedi versione modificata – zetetic

+0

Sì! lui strip_tags è il modo migliore per andare. Grazie! – Hock

1

Innanzitutto, il problema è che Array#each restituisce l'array di input indipendentemente dal contenuto del blocco. Un paio di persone sono appena passate dallo Array#each con me in una domanda che ho chiesto: "Return hash with modified values in Ruby".

In secondo luogo, a parte il Array#each non facendo davvero quello che vuoi qui, non penso che dovresti farlo comunque. Perché dovresti eseguire questo metodo su ALL gli attributi del modello?

Infine, perché non mantenere l'input HTML dagli utenti e utilizzare l'helper standard h() durante l'output?

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

Questo è utile perché è possibile visualizzare il database e vedere i dati non modificati esattamente come è stato immesso dall'utente (se necessario). Se davvero devi convertire in testo normale prima di salvare il valore, la soluzione di @ zetetic ti consente di iniziare.

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

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

end 
4

basta usare lo strip_tags() testo di supporto come detto da Zetetic

10

Sarebbe meglio non includere vista aiutanti nel modello.Basta usare:

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

Sanitizer di riferimento Rails direttamente senza utilizzare include.

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

NOTA: I allegata .html_safe per rendere entità HTML come &nbsp; rendono correttamente. Non usare questo se c'è un potenziale per l'iniezione di JavaScript dannoso.

0

Se si desidera rimuovere &nbsp; con tag html, nokogiri può essere utilizzato

include ActionView::Helpers::SanitizeHelper 

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