Rails 3和html_safe混淆(允许聊天中的图片(微笑)但拒绝其他一切)

时间:2011-06-28 10:36:57

标签: ruby ruby-on-rails-3 gsub 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 %>

但它不适合我,因为图片也会显示和其他标签。

我的问题是:如何仅显示我的笑容,忽略其他标签?

1 个答案:

答案 0 :(得分:3)

我认为你需要这样做:

  1. HTML编码字符串。
  2. 执行替换。
  3. 将最终结果标记为HTML安全。
  4. 添加如下的帮助:

    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
    

    然后在你的再培训局:

    <%= expand_smilies some_text %>
    

    ERB使用ERB::Util::html_escape对HTML进行编码,因此如果您的目标是ERB,那么自己使用它是有意义的。在字符串上调用html_safe会返回ERB在HTML编码时单独留下的内容。

    请注意,字符串上没有可用的html_safe!,而html_safe返回ActiveSupport::SafeBuffer而不是字符串,因此您必须使用帮助程序而不是猴子修补新方法串。 ActiveSupport会将html_safe!方法修补为字符串,但它只会引发一个异常,说“不要这样做”:

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