2013-05-16 105 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字符串的結束,而是得到了以下錯誤:

未定義的方法`html_safe」爲‘未轉義<> &內容’:字符串

後來意識到,對於這個特定的應用,我不使用Rails,只是ruby + HAML。 (我繼承了這個項目,並且我剛剛開始學習HAML,ruby和Rails)但是,對於那些懶得點擊鏈接而沒有閱讀我提到的解決方案的人, d寧願不將HAML配置爲不爲整個文件轉義attrs,只是針對這一個屬性。

謝謝!

UPDATE

我剛剛發現的:普通過濾嘴,並能得到我想要的東西使用。但是,如果有一個技巧我不知道,所以我不必編寫所有的HTML,我會很感激。我的「修復」:

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

使用:平紋打破HAML的一致性...是否有一個更好嗎? – chfw

回答

0

您是否嘗試過使用\來轉義字符。

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

+0

是的,「轉義」字符導致反斜槓被忽略,但字符被轉義。我甚至試圖用正斜槓逃跑,只是因爲HAML瘋了。沒有運氣 :) – thexfactor

4

沒有(目前)沒有辦法關閉逃逸在Haml的Rails的之外的個體屬性,它的所有或使用:escape_attrs選項罷了。根據你想要的,可能值得看看:once option

當Haml在Rails中使用時,它將用一些尊重ActiveSupport添加的html_safe值(請參閱lib/haml/helpers/xss_mods.rb)的值替換html轉義方法。

如果需要,可以在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>