我有一个类似于我在stackoverflow上发现的问题,但不完全相同.我想避免解决以下问题:
基本上,想要以下HTML输出:
<div class='myclass' extraattr='UNESCAPED <>& CONTENT'>
Content...
</div>
Run Code Online (Sandbox Code Playgroud)
我使用的HAML看起来像这样:
.myclass{ "extraattr" => "UNESCAPED <>& CONTENT" }
Content...
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何让内容以我想要的方式输出.尝试将.html_safe应用到字符串的末尾,但收到以下错误:
未定义的方法`html_safe'代表"UNESCAPED <>&CONTENT":字符串
后来意识到,对于这个特定的应用程序,我不使用Rails,只是ruby + HAML.(我继承了这个项目,我只是开始学习HAML,ruby和Rails)
而且,对于那些懒得单击链接并且没有阅读我提到的解决方案的人,我宁愿不将HAML配置为不为整个文件转义attrs,只是为了这个属性.
谢谢!
UPDATE
我刚刚找到了:普通过滤器,并且能够得到我想要的东西.但是,如果有一个我不知道的技巧,所以我不必编写所有的HTML,我会很感激.我的"修复":
:plain
<div class='myclass' extraattr='UNESCAPED <>& CONTENT'>
Content...
</div>
Run Code Online (Sandbox Code Playgroud)
在(目前)没有任何方法可以关闭在Rails之外的Haml中的单个属性的转义,使用该:escape_attrs选项可以全部或全部.根据您的需要,可能值得查看该:once选项.
当在Rails中使用Haml时,它将html转义方法替换为一些尊重html_safeActiveSupport添加的值(请参阅参考资料lib/haml/helpers/xss_mods.rb).
如果需要,可以在Rails之外使用这些方法.你需要在String类中添加html_safe和html_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
Run Code Online (Sandbox Code Playgroud)
现在你可以使用html_safe你的字符串了,Haml不会逃脱它们:
.myclass{ "extraattr" => "UNESCAPED <>& CONTENT".html_safe,
"otherextraattr" => "ESCAPED <>& CONTENT"}
Content...
Run Code Online (Sandbox Code Playgroud)
输出:
<div class='myclass' extraattr='UNESCAPED <>& CONTENT' otherextraattr='ESCAPED <>& CONTENT'>
Content...
</div>
Run Code Online (Sandbox Code Playgroud)