4

在 Sinatra 中,使用 erubis 的默认设置escape_htmltrue.

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

helpers:

def raw(string)
  CGI::unescape_html(string)
end

views:

<div class="body">
  <%= raw "<h1>Thanks for help...</h1>" %>
</div>

不起作用。

4

3 回答 3

5

只是添加一些提示。Erubis 具有逃避(净化)表达的能力。Erubis::Eruby 类的行为如下:

<%= expr %> - not escaped.
<%== expr %> - escaped.
<%=== expr %> - out to $stderr.
<%==== expr %> - ignored.

来源

于 2013-02-03T15:50:48.283 回答
4

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

<%== "<h1>Thanks for help...</h1>" %>

调用 toCGI::unescape不应该是必要的,因为字符串最初没有转义。您所需要的只是防止转义,而不是撤消它。

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

仅供参考,在 Rails 中也有特殊的助手rawString#html_safe,但我可以看到它们是 ActiveSupport 的一部分,在 Sinatra 中不可用。

于 2013-02-03T15:05:20.757 回答
0

你可以通过这种方式完成你想要的:

网页.rb:

require 'sinatra'
require 'erubis'
set :erb, :escape_html => true

get '/hi' do
  @model = Hash.new()
  @model[:person] = "<b>World</b>"
  erb :hello
end

布局.erb:

<!DOCTYPE html>
<html>
<head>
  <title><%= @title %></title>
</head>
<body>
  <%== yield %>
</body>
</html>

你好.erb:

<div>
  <p>Hello, <%= @model[:person] %>!</p>
  <p>Hello, <%== @model[:person] %>!</p>
</div>
于 2013-04-08T01:47:41.613 回答