在属性哈希中不转义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' for "UNESCAPED <>&内容":字符串

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

并且,对于那些懒得点击链接并且没有阅读我提到的解决方案的人,我更愿意不将HAML配置为不转义整个文件的attrs,只针对这一个属性。

谢谢!

我刚刚找到了:plain过滤器,并且能够使用它得到我想要的。但是,如果有一个技巧我不知道,这样我就不必编写所有的HTML,我会很感激。我的"修复":

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

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

当Haml在Rails中使用时,它将html转义方法替换为一些尊重activessupport添加的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>

您是否尝试过使用转义字符?

{ :myattr => '<>&' }

最新更新