4

Sinatra では、erubis を使用して、のデフォルト設定はescape_htmlですtrue

しかし、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 を使用しているかはわかりませんがその特定のケース用に特別な種類のタグがあるようです: 2 つの等号が付いています。したがって、例の行は次のようになります。

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

文字列は最初はエスケープされていないため、を呼び出すCGI::unescape必要はありません。必要なのは、元に戻すのではなく、エスケープを防止することだけです。

しかし、Erubis が理解できない<%==場合、または Erubis ではなく ERB を使用している場合は、申し訳ありませんが、あなたが言ったこと以外の解決策はわかりません: ファイル全体の html エスケープを無効にし、エスケープhが必要なすべての場所で使用してください。

参考までに、Rails にもこのための特別なヘルパーrawとがありますString#html_safeが、私が見ることができるように、それらは ActiveSupport の一部であり、Sinatra では利用できません。

于 2013-02-03T15:05:20.757 に答える
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

レイアウト.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 に答える