在使用erubis的sinatra中,默认设置escape_html为true。有时变得无法逃脱

ken*_*nx9 4 ruby erb sinatra erubis

在西纳特拉,使用erubis,默认设置escape_htmltrue

但是有时我想取消转义,因为,我不想添加太多的escape_html。不要重复自己。:)

helpers:

def raw(string)
  CGI::unescape_html(string)
end
Run Code Online (Sandbox Code Playgroud)

views:

<div class="body">
  <%= raw "<h1>Thanks for help...</h1>" %>
</div>
Run Code Online (Sandbox Code Playgroud)

不起作用。

Yev*_*yev 5

只是添加一些技巧。Erubis具有逃避(消毒)表达的能力。Erubis :: Eruby类的作用如下:

<%= expr %> - not escaped.
<%== expr %> - escaped.
<%=== expr %> - out to $stderr.
<%==== expr %> - ignored.
Run Code Online (Sandbox Code Playgroud)

资源


NIA*_*NIA 4

不确定您使用的是哪个版本的 Erubis,但似乎它针对特定情况有一种特殊的标签:带有两个等号。因此,您的示例中的行可能如下所示:

<%== "<h1>Thanks for help...</h1>" %>
Run Code Online (Sandbox Code Playgroud)

调用 toCGI::unescape应该不是必要的,因为字符串最初并未转义。您所需要做的就是防止逃逸,而不是撤消它。

但是,如果您的 Erubis 不理解<%==,或者如果您使用 ERB,而不是 Erubis,那么抱歉,除了您所说的之外,我不知道任何其他解决方案:禁用整个文件的 html 转义并在h您确实需要转义的任何地方使用。

仅供参考,在 Rails 中也有特殊的帮助程序rawString#html_safe,但正如我所见,它们是 ActiveSupport 的一部分,在 Sinatra 中不可用。