我遇到了一个类似于我在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_safe
和html_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 <>& CONTENT'>
Content...
</div>
您是否尝试过使用转义字符?
{ :myattr => '<>&' }