Ruby on rails 标题标记在Rails/HAML中转义两次
我有一个Rails 3.2.13应用程序,其中的标题包含站点名称和特定于页面的文本。公共部分在布局中定义,页面特定部分在每个HAML视图中定义 首先,我使用了Ruby on rails 标题标记在Rails/HAML中转义两次,ruby-on-rails,ruby-on-rails-3,escaping,haml,title,Ruby On Rails,Ruby On Rails 3,Escaping,Haml,Title,我有一个Rails 3.2.13应用程序,其中的标题包含站点名称和特定于页面的文本。公共部分在布局中定义,页面特定部分在每个HAML视图中定义 首先,我使用了provide,如下所示: # layout.html.haml %title= (content_for?(:title) ? "#{yield(:title)} | " : "") + "Chunky-B" # show.html.haml - provide(:title, @listing.name) 我的问题是,当从模型中提取
provide
,如下所示:
# layout.html.haml
%title= (content_for?(:title) ? "#{yield(:title)} | " : "") + "Chunky-B"
# show.html.haml
- provide(:title, @listing.name)
我的问题是,当从模型中提取特定于页面的内容时,它会得到两次转义。如果@listing.name
包含一个(未转换的)符号,我将获得输出
<title>Bacon &amp; Eggs | Chunky-B</title>
Bacon&;amp;蛋|粗B
最近,我转而使用我的标题和元描述,但同样的问题仍然存在
我知道我需要一些
h
,html\u-safe
或者甚至raw
的组合。有了答案和一些尝试和错误,我可能会达到目的,但我以前不必绕过内置的转义,也不想冒着打开漏洞的风险对自己进行二次猜测。在写这个问题时,我有一种直觉,知道应该怎么做,但我敢打赌,答案会比我快 像往常一样,我一直在看答案
根据,我使用(h@listing.name).html\u safe
得到了我想要的结果,如果我相信评论者的话,这是“常见和公认的用法”
如果我理解正确,我将强制使用h
对名称进行转义,以保护我免受各种邪恶的侵害,然后使用.html\u safe
调用将其标记为不需要任何额外的转义
一切看起来都很好,输出转义一次并在我的浏览器标题栏中正确呈现。不过,我需要一些保证,这是安全可靠的。如果有人能给出一个高质量的答案,解释为什么我不能从盒子里得到同样的结果,我会准备把它标记为接受。我遇到了同样的问题,发现了一个比使用
html\u safe
更安全的解决方案
首先,更新后的代码:
# layout.html.haml
%title = full_title("Chunky-B")
其中“安全标题”为:
def完整标题(页面标题)
base_title=”“.html_安全
如果内容为?(:标题)
base_title我遇到过这个问题,它似乎只有在标题作为简单内容传递时才会发生:
content_for :title, 'Wow & Fail'
#=> Wow &amp; Fail
但当它作为块传递时,它会正确渲染:
content_for :title do
'Wow & Fail'
#=> Wow & Fail
正如你在这里看到的
只有当您通过一个块时才使用捕获方法,该块利用了主动支持的输出安全性您被截取的代码真的能满足您的需要吗?我不确定是否有%haml_标签谢谢--修复了答案。我试图调整课程以适应OP,但没有意识到我不能%haml\u标记
content_for :title do
'Wow & Fail'
#=> Wow & Fail