2010-04-05 12 views
11

मेरे पास एक प्रोजेक्ट मॉडल है और इसमें कुछ टेक्स्ट विशेषताएँ हैं, एक सारांश है। मेरे पास कुछ प्रोजेक्ट हैं जिनमें सारांश में HTML टैग हैं और मैं इसे सादा पाठ में रूपांतरित करना चाहता हूं। मेरे पास यह तरीका है जिसमें एक रेगेक्स है जो सभी 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 

समस्या यह है कि एचटीएमएल टैग अभी भी परियोजना बचाने के बाद देखते हैं क्या है। मैं क्या खो रहा हूँ?

और, क्या सभी मॉडलों में उस विधि को रखने का एक बहुत ही आसान तरीका है?

धन्यवाद,

निकोलस ओल Isaza

+2

इस्तेमाल किया जा सकता मैं कर रहा हूँ नहीं एक गहरे लाल रंग का उपयोगकर्ता है, लेकिन वहाँ कोई भी काम वहाँ होने वाली होने के लिए प्रतीत नहीं होता। आप उन चीजों के साथ स्ट्रिंग की गणना कर रहे हैं, लेकिन कहीं भी इसे सहेज नहीं रहे हैं। – Yuliy

+0

@Yuliy ruby ​​mutable तार है! (gsub! gsub का म्यूटेबल रूप है - ick!) !!! (अच्छे मापन के लिए) !!! (और मुझे इसे कठिन बनाने के लिए +1) –

उत्तर

44

अपरीक्षित

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = sanitize(html_input) 
end 

जहां html_input एक स्ट्रिंग HTML टैग युक्त है।

संपादित

आप :tags=>[] एक विकल्प के रूप में उत्तीर्ण होकर सभी टैग पट्टी कर सकते हैं:

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

हालांकि docs मैं देख रहा हूँ वहाँ एक बेहतर तरीका है पढ़ने:

plain_text = strip_tags(html_input)

फिर इसे smotchkiss प्रति फ़िल्टर पहले बनाएं और आपको जाना अच्छा लगेगा।

+0

मैं इसे sanitize नहीं करना चाहता। मैं उन्हें हटाना चाहता हूं। अगर मेरे पास हैलो मैं सिर्फ हैलो स्टोर करना चाहता हूं – Hock

+0

संपादित संस्करण – zetetic

+0

हाँ देखें! वह स्ट्रिप_टैग जाने का सबसे अच्छा तरीका है। धन्यवाद! – Hock

1

सबसे पहले, यहां मुद्दा यह है कि Array#each ब्लॉक सामग्री के बावजूद इनपुट सरणी देता है। मैंने पूछा कि "Return hash with modified values in Ruby" एक प्रश्न में मेरे साथ कुछ लोग पर गए थे।

दूसरा, Array#each के अलावा वास्तव में आप जो भी चाहते हैं वह वास्तव में नहीं कर रहे हैं, मुझे नहीं लगता कि आपको वैसे भी ऐसा करना चाहिए। मॉडल की विशेषताओं को सभी पर इस विधि को चलाने की आवश्यकता क्यों होगी?

आखिरकार, उपयोगकर्ताओं से HTML इनपुट क्यों न रखें और इसे आउटपुट करते समय मानक h() सहायक का उपयोग करें?

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

क्योंकि आप डेटाबेस देखने और असंशोधित डेटा देखने के बिल्कुल के रूप में यह उपयोगकर्ता द्वारा दर्ज किया गया था (यदि आवश्यक) कर सकते हैं तो यह उपयोगी है। यदि मूल्य को सहेजने से पहले आपको वास्तव में सादा पाठ में परिवर्तित करना होगा, तो @ zetetic का समाधान शुरू हो जाता है। के रूप में द्वारा zetetic

4

बस strip_tags() पाठ सहायक का उपयोग यह अपने मॉडल में दृश्य सहायकों शामिल करने के लिए बेहतर नहीं होगा।बस उपयोग करें:

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

उल्लेख

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

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

end 
1

संदर्भ रेल के सैनिटाइज़र सीधे उपयोग किए बिना शामिल हैं।

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

नोट: मैं &nbsp; तरह HTML संस्थाओं को सही ढंग से प्रस्तुत करना सुनिश्चित करने के लिए .html_safe संलग्न। दुर्भावनापूर्ण जावास्क्रिप्ट इंजेक्शन की संभावना होने पर इसका उपयोग न करें।

0

आप html टैग के साथ &nbsp; निकालना चाहते हैं, nokogiri

include ActionView::Helpers::SanitizeHelper 

def foo 
    sanitized_output = strip_tags(html_input) 
    Nokogiri::HTML.fragment(sanitized_output) 
end 
संबंधित मुद्दे