Печать в erb без '<% =%>' или ruby ​​на рельсах

Похоже на печать в ERB без <% =?

Тем не менее, ответ там специфичен для ruby ​​на рельсах. Есть ли подобная возможность в ванильном эрбе?

Вот пример использования:

<% [
    'host_perfdata_command',
    'service_perfdata_command',
].each do |var|
    value = instance_variable_get("@#{var}")
    if value
        %><%= "#{var}=#{value}" %><%
    end
end
-%>

Пока это работает, it i%><%=s hard to r%><%ead.

3 ответа

Решение

По сути, вам нужно записать непосредственно в выходную строку. Вот минимальный пример:

template = <<EOF
Var one is <% print_into_ERB var1 %>
Var two is <%= var2 %>
EOF

var1 = "The first variable"
var2 = "The second one"
output = nil

define_method(:print_into_ERB) {|str| output << str }

erb = ERB.new(template, nil, nil, 'output')
result = erb.result(binding)

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

Попробуйте следующим образом:

<%= [ 'host_perfdata_command', 'service_perfdata_command' ].map do |var|
    value = instance_variable_get("@#{var}")
    value && "#{var}=#{value}"
end.compact.join( "<br>" ) -%>

Затем вы можете объединить массив с желаемой строкой.

ПРИМЕЧАНИЕ: я настоятельно рекомендую вам переместить код в помощник.

помощник:

def commands_hash_inspect
   [ 'host_perfdata_command', 'service_perfdata_command' ].map do |var|
      value = instance_variable_get("@#{var}")
      value && "#{var}=#{value}"
   end.compact.join( "<br>" )
end

вид:

<%= commands_hash_inspect -%>

Что не так с этим:

<% ['host_perfdata_command', 'service_perfdata_command'].each do |var| %>
    <% if (value = instance_variable_get("@#{var}")) %>
        <%= "#{var}=#{value}" %>
    <% end %>
<% end %>
Другие вопросы по тегам