1

スマイリー (":-)" など) をアイコンとして置き換えるモジュールがあります。

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 %>

しかし、写真や他のタグも表示されるので、私には合いません。

私の質問は: 他のタグを無視して、私の笑顔だけを表示するにはどうすればよいですか?

4

1 に答える 1

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_escapeHTML のエンコードに使用するため、ERB をターゲットにしている場合は、自分で使用することは理にかなっています。文字列を呼び出すhtml_safeと、HTML エンコーディングの場合に ERB がそのままにしておく何かが返されます。

html_safe!文字列では使用できず、文字列ではなくActiveSupport::SafeBufferhtml_safeを返すことに注意してください。そのため、新しいメソッドを文字列にモンキー パッチするのではなく、ヘルパーを使用する必要があります。ActiveSupport はメソッドを String にパッチしますが、「それをしないでください」という例外を発生させるだけです。html_safe!

def html_safe!
  raise "You can't call html_safe! on a String"
end
于 2011-06-28T14:37:48.080 に答える