2010-04-05 9 views
11

Mam model projektu i ma pewne atrybuty tekstu, jeden jest podsumowanie. Mam kilka projektów, które mają tagi html w podsumowaniu i chcę je przekonwertować na zwykły tekst. Mam tę metodę, która ma wyrażenie regularne, które usunie wszystkie znaczniki html.Usuń wszystkie znaczniki html z atrybutów w szynach

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

Ja też mieć filtr before_save

before_save :strip_html_comments_on_data 

Problemem jest to, że znaczniki HTML są nadal po zapisaniu projektu. czego mi brakuje?

Czy istnieje naprawdę prosty sposób na wywoływanie tej metody we wszystkich modelach?

Dzięki,

Nicolás Hock Isaza

+2

Nie jestem użytkownika rubinowy, ale nie wydaje się być dowolny przydział występujące tam. Obliczysz ciąg z tymi rzeczami, które zostały usunięte, ale nie oszczędzasz ich w dowolnym miejscu. – Yuliy

+0

@Yuliy ruby ​​ma zmienne łańcuchy! (gsub! to zmienna forma gsub - ick!) !!! (na dokładkę) !!! (i +1 za sprawienie, żebym spojrzał na to mocniej) –

Odpowiedz

44

niesprawdzone

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

gdzie html_input jest ciągiem zawierającym znaczniki HTML.

EDIT

Można rozebrać wszystkie znaczniki przekazując :tags=>[] jako opcja:

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

Choć czytanie docs widzę istnieje lepsza metoda:

plain_text = strip_tags(html_input)

Następnie przejdź do filtra przedniego na smotchkiss i możesz już iść.

+0

Nie chcę tego oczyszczać. Chcę je usunąć. Jeśli mam cześć Chcę przechowywać tylko cześć – Hock

+0

zobacz wersję edytowaną – zetetic

+0

Tak! on strip_tags to najlepsza droga. Dziękuję Ci! – Hock

1

Po pierwsze, problem polega na tym, że Array#each zwraca tablicę wejściową niezależnie od zawartości bloku. Kilka osób właśnie przeszło Array#each ze mną w pytaniu, które zadałem: "Return hash with modified values in Ruby".

Po drugie, pomijając Array#each tak naprawdę nie robiąc tego, co chcesz tutaj, nie sądzę, że powinieneś tak robić. Dlaczego trzeba uruchomić tę metodę ponad atrybutami modelu?

Wreszcie, dlaczego nie przechowywać danych wejściowych HTML od użytkowników i po prostu użyć standardowego pomocnika h() podczas wyprowadzania?

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

Jest to przydatne, ponieważ można wyświetlić bazę danych i zobaczyć niezmodyfikowane dane dokładnie tak, jak zostały wprowadzone przez użytkownika (w razie potrzeby). Jeśli naprawdę musisz przekonwertować na zwykły tekst przed zapisaniem wartości, rozwiązanie @ zetetic pomoże Ci zacząć.

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

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

end 
4

Wystarczy użyć strip_tags() pomocnika tekst jak wspomniano przez zetetic

10

Byłoby lepiej nie zawierać widoku pomocników w modelu.Po prostu użyj:

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

Środek dezynfekujący Rails bezpośrednio bez użycia.

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

UWAGA: I dołączana .html_safe aby podmioty HTML jak &nbsp; renderowania poprawnie. Nie używaj tego, jeśli istnieje ryzyko złośliwego iniekcji JavaScript.

0

Jeśli chcesz usunąć &nbsp; wraz z tagów HTML, może być stosowany nokogiri

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = strip_tags(html_input) 
    Nokogiri::HTML.fragment(sanitized_output) 
end 
Powiązane problemy