在属性哈希中转义HAML

时间:2013-05-16 20:15:57

标签: ruby haml

我遇到的问题类似于我在stackoverflow上找到的一些问题,但不完全相同。我想避免解决以下问题:

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&#39; for&#34; UNESCAPED&lt;&gt;&amp; CONTENT&#34;:字符串

后来意识到,对于这个特定的应用程序我不使用Rails,只是ruby + HAML。 (我继承了这个项目,我开始学习HAML,ruby和Rails)

再一次,对于那些懒得单击链接并且没有阅读我提到的解决方案的人,我不希望将HAML配置为不为整个文件转义attrs,仅为此一个属性。

谢谢!

更新

我刚刚找到了:普通过滤器,并且能够得到我想要的东西。但是,如果有一个技巧我不知道,所以我不必编写所有的HTML,我很感激。我的修理&#34;:

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

2 个答案:

答案 0 :(得分:5)

没有(目前)任何方法可以在Rails之外的Haml中关闭单个属性的转义,使用:escape_attrs选项可以全部或全部。根据您的需要,可能值得查看:once option

当在Rails中使用Haml时,它会将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>

答案 1 :(得分:0)

您是否尝试使用\来转义角色。

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