7

我有一个类似于我在 stackoverflow 上发现的问题,但并不完全相同。我想避免解决以下问题:

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

基本上,想要以下 HTML 输出:

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

我正在使用的 HAML 如下所示:

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

我不太清楚如何让内容以我想要的方式输出。尝试将 .html_safe 应用到字符串的末尾,但出现以下错误:

“UNESCAPED <>& CONTENT”的未定义方法“html_safe”:字符串

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

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

谢谢!

更新

我刚刚找到了 :plain 过滤器,并且能够使用它获得我想要的东西。但是,如果有一个我不知道的技巧,所以我不必编写所有的 HTML,我将不胜感激。我的“修复”:

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

2 回答 2

6

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

当在 Rails 中使用 Haml 时,它将 html 转义方法替换为一些尊重html_safeActiveSupport 添加的值的方法(请参阅 参考资料lib/haml/helpers/xss_mods.rb)。

如果您愿意,可以在 Rails 之外使用这些方法。您需要向 String 类添加html_safehtml_safe?方法才能使其正常工作(这里要小心,这个示例只是 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>
于 2013-05-17T20:04:25.847 回答
0

您是否尝试过使用 a\来转义字符。

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

于 2013-05-16T22:45:22.713 回答