2010-04-05 79 views
11

我有一個Project模型,它有一些文本屬性,一個是摘要。我有一些在摘要中有html標籤的項目,我想將其轉換爲純文本。我有這個方法,有一個正則表達式,將刪除所有的HTML標籤。從rails中的屬性中刪除所有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 

的問題是,html標籤仍然存在保存項目之後。我錯過了什麼?

而且,是否有一種非常簡單的方法可以在所有模型中調用該方法?

謝謝,

尼古拉斯鶴伊薩薩

+2

我不是一個紅寶石用戶,但似乎沒有任何被分配在那裏出現。你正在計算一個帶有這些東西的字符串,但不會在任何地方保存。 – Yuliy 2010-04-05 00:21:42

+0

@Yuliy紅寶石有可變的字符串! (gsub!是gsub - ick!的可變形式!)!!! (爲好措施)! (+1讓我更難看) – 2010-04-05 04:55:51

回答

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

我不想消毒。我想刪除它們。如果我有你好我想只存儲你好 – Hock 2010-04-05 13:54:52

+0

查看編輯版本 – zetetic 2010-04-05 15:25:35

+0

是啊!他strip_tags是最好的選擇。謝謝! – Hock 2010-04-07 11:53:59

1

首先,這裏的問題是Array#each返回輸入數組,無論塊內容如何。有一對夫婦在我問了一個問題時剛剛跟着我走過Array#each"Return hash with modified values in Ruby"

第二,除了Array#each沒有真正做到你想要的東西在這裏,我認爲你不應該這樣做。爲什麼你需要通過全部這個模型的屬性來運行這個方法?

最後,爲什麼不保留來自用戶的HTML輸入,並在輸出時只使用標準h()助手?

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

這是有用的,因爲你可以查看數據庫並看到未修改的數據正是因爲它是由用戶輸入(如果需要)。如果你真的必須在保存值之前轉換爲純文本,@ zetetic的解決方案可以讓你開始。

include ActionView::Helpers::SanitizeHelper 

class Comment < ActiveRecord::Base 

    before_save :sanitize_html 

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

end 
4

只需使用用strip_tags()文本助手,通過探究性

10

提到這將是最好不要在您的模型視圖助手。只需使用:

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

參考Rails的殺菌劑直接不使用包括。

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

注:我附加.html_safe使HTML實體,如&nbsp;正確呈現。如果存在惡意JavaScript注入的可能性,請不要使用它。

0

如果你想使用HTML標籤一起拔出&nbsp;,引入nokogiri可用於

include ActionView::Helpers::SanitizeHelper 

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