在使用erubis的sinatra中,默认设置escape_html为true。有时hava to unescape

时间:2013-02-03 14:32:58

标签: ruby sinatra erb erubis

在Sinatra中,使用erubis,escape_html的默认设置为true

但有时候我想要unescape,因为,我不想添加太多的escape_html。不要重复自己。 :)

helpers:

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

views:

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

不起作用。

3 个答案:

答案 0 :(得分:4)

只是添加一些提示。 Erubis有逃脱(消毒)表达的能力。 Erubis :: Eruby类如下:

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

Source

答案 1 :(得分:3)

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

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

不需要调用CGI::unescape,因为字符串最初未被转义。您只需要阻止转义,而不是撤消它。

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

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

答案 2 :(得分:0)

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

Web.rb:

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

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

Layout.erb:

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

Hello.erb:

<div>
  <p>Hello, <%= @model[:person] %>!</p>
  <p>Hello, <%== @model[:person] %>!</p>
</div>