2011-06-28 35 views
1

我這裏是替換的表情符號(如「:-)」)的模塊的圖標:的Rails 3和html_safe混亂(允許圖片(笑)在聊天,但否認一切)

module Smileize 
    PATH = "/images/smiles" 
    SMILES = [/\;\-?p/i, /\$\-?\)/, /8\-?\)/, /\>\:\-?\(/, /\:\-?\*/, /\:\-?o/i, /\:\-?c/i, /\;\-?\)/, 
/\:\-?s/i, /\:\-?\|/, /\:\-?p/i, /\:\-?D/i, /\:\-?\?/, /\:\-?\(/, /\:\-?\)/] 
    def to_icon(key) 
    return "<img class='smiley' src='#{PATH}/smile#{SMILES.index(key) + 1}.png'/>" 
    end 
    module_function :to_icon 
end 

class String 
    def to_smile 
    Smileize::SMILES.each do |smile| 
     if self =~ smile 
     self.gsub!(smile, Smileize.to_icon(smile)) 
     end 
    end 
    self 
    end 
end 

所以圖片顯示的是我使用html_safe,像這樣:

<%= @message.text.to_smile.html_safe %> 

但它不適合我,因爲但照片將顯示等標籤了。

我的問題是:如何只顯示我的笑容,忽略其他標籤?

回答

3

我認爲你需要做的是這樣的:

  1. HTML編碼字符串。
  2. 進行替換。
  3. 將最終結果標記爲HTML安全。

添加一個幫手是這樣的:

def expand_smilies(s) 
    s = ERB::Util::html_escape(s) 
    Smileize::SMILES.each do |smile| 
    s.gsub!(smile, Smileize.to_icon(smile)) 
    end 
    s.html_safe 
end 

,然後在ERB:

<%= expand_smilies some_text %> 

ERB使用ERB::Util::html_escape編碼的HTML因此使用它自己有道理的,如果你的目標ERB。在字符串上調用html_safe會返回一些ERB在HTML編碼事物時將單獨留下的內容。

注意,有對字串沒有可用html_safe!html_safe返回ActiveSupport::SafeBuffer而不是字符串,所以你必須使用一個幫手,而不是猴子打補丁的新方法轉換成String。的ActiveSupport做修補的html_safe!方法轉換成String,但它所做的只是拋出一個異常說:「不這樣做」:

def html_safe! 
    raise "You can't call html_safe! on a String" 
end 
+0

是的,與ERB ::的Util :: html_escape工作得很好,非常感謝! – Yud