В синатре с использованием erubis значение по умолчанию escape_html - true. иногда хава в эскейп

В 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>

не работает.

3 ответа

Решение

Не уверен насчет того, какую версию Erubis вы используете, но похоже, что у него есть особый вид тега для этого конкретного случая: с двумя знаками равенства. Таким образом, строка из вашего примера может выглядеть так:

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

Призыв к CGI::unescape не должно быть необходимо, потому что строка изначально не экранирована. Все, что вам нужно, это предотвратить побег, а не отменить его.

Но если ваш эруби не понимают <%== или, если вы используете ERB, а не Erubis, то извините, я не знаю другого решения, кроме того, что вы сказали: отключите html escape для всего файла и используйте h везде, где вам нужно бежать.

К вашему сведению, в Rails для этого также есть специальные помощники raw а также String#html_safe , но, как я вижу, они являются частью ActiveSupport и недоступны в Синатре.

Просто чтобы добавить несколько советов. Эрубис обладает способностью избегать (дезинфицировать) выражения. Erubis::Eruby class действуют следующим образом:

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

Источник

Вы можете выполнить то, что вы хотите, таким образом:

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>
Другие вопросы по тегам