Rails3和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. 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,因此您必须使用助手而不是猴子将新方法修补到String中。ActiveSupport确实将html_safe!方法修补到String中,但它所做的只是引发一个异常,说"不要那样做":

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

相关内容

  • 没有找到相关文章

最新更新