2013-05-16 4 views
7

私はstackoverflowで見つかったいくつかの問題に似ていますが、全く同じではありません。属性ハッシュでのHAMLのアンエスケープ

https://stackoverflow.com/a/10407782/996587

基本的には、以下のHTML出力をしたいと思います:私は、次の質問に対する解決策を避けたいのですが

<div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
</div> 

私はこのようになります使用していHAML:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT" } 
    Content... 

私が望むようにコンテンツを出力する方法を理解できません。文字列の末尾に.html_safeを適用しようとしましたが、次のエラーを得た:

『エスケープ<> & CONTENT』のための `html_safe」未定義のメソッド:文字列が

その後、この特定のアプリケーションのために私は気づいRailsを使わず、ちょうどruby + HAML。 (私はこのプロジェクトを継承し、とにかくHAML、Ruby、Railsを学び始めたばかりです)

また、リンクをクリックするのが怠惰で、私が言及した解決法を読んでいない人にとって、 dは、この1つの属性のためだけに、ファイル全体に対してattrsをエスケープしないようにHAMLを構成しないことをお勧めします。

ありがとうございます!

UPDATE

私だけが見つかりました:プレーンフィルタを、と私はそれを使用して欲しかったものを手に入れることができました。しかし、もし私が知らないトリックがあるなら、私はすべてのHTMLを書く必要はありません、私はそれを感謝します。私の「修正」:

:plain 
    <div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
    </div> 
+0

の使用:平野があり... HAMLの一貫性を破りますもっといい? – chfw

答えて

0

あなたは文字をエスケープする\を使用してみました。

{ :myattr => '\<\>\&' }

+0

「エスケープ」文字を使用すると、バックスラッシュは無視されますが、エスケープされる文字になります。私はスラッシュでエスケープしようとしても、ちょうどHAMLが夢中になってしまった。いいえ:) – thexfactor

4

レールの外側のHAML内の個々の属性のエスケープオフにする方法は、(現在は)ありません、それは:escape_attrsオプションを使用して、全か無かです。あなたが望むものに応じて、:once optionを調べる価値があります。

HamlがRailsで使用されるとき、htmlエスケープメソッドを、ActiveSupportが追加するhtml_safeの値(lib/haml/helpers/xss_mods.rb参照)を考慮したものに置き換えます。

必要に応じて、これらのメソッドをRailsの外で使用することは可能です。このためには、html_safehtml_safe?のメソッドをStringクラスに追加する必要があります(この例は注意してください。この例は、Railsが提供する完全なXSS保護の「貧弱な人」のバージョンです。それは属性の選択的エスケープを可能にします)。

(これは必須ます独自のファイルで最高のかもしれない)HAMLを必要とした後、どこかに以下を追加します。

class String 
    def html_safe? 
    defined?(@html_safe) && @html_safe 
    end 

    def html_safe 
    @html_safe = true 
    self 
    end 
end 

require 'haml/helpers/xss_mods' 

module Haml::Helpers 
    include Haml::Helpers::XssMods 
end 

今、あなたの文字列にhtml_safeを使用することができ、かつHAMLはそれらをエスケープしません。

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT".html_safe, 
      "otherextraattr" => "ESCAPED <>& CONTENT"} 
    Content... 

出力:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT' otherextraattr='ESCAPED &lt;&gt;&amp; CONTENT'> 
    Content... 
</div> 
関連する問題