【问题标题】:printing in erb without '<%= %>' or ruby on rails在没有 '<%= %>' 或 ruby​​ on rails 的 erb 中打印
【发布时间】:2014-01-31 16:48:44
【问题描述】:

类似于Print in ERB without <%=?

但是,那里的答案是特定于 ruby​​ on rails 的。 vanilla erb有类似的能力吗?

这是一个用例:

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

虽然这行得通,it i%&gt;&lt;%=s hard to r%&gt;&lt;%ead.

【问题讨论】:

  • 试试HAML
  • @zeantsoi 不幸的是,我不是选择 erb 的人。我只是在使用另一个选择它的工具。
  • @zeantsoi 同样,据我所知,HAML 非常特定于 HTML。我的示例不是 HTML。
  • 我推荐它是因为它从代码中抽象出 ERB 标签。你是对的......它可能不适合您的特定需求,在这种情况下:使用其他东西。

标签: ruby-on-rails eruby


【解决方案1】:

基本上,您需要直接写入输出字符串。这是一个最小的例子:

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)

但是因为我觉得有义务指出它,所以需要这个是很不寻常的。正如其他答案所观察到的,有多种方法可以重写问题中的模板以使其可读,而无需直接连接到输出字符串。但这是你在需要时会这样做的方式。

【讨论】:

  • 虽然不幸的是我使用的工具只允许我使用模板,我不想修补工具,但我不能这样做,你已经回答了这个问题:不可能.看来我将不得不接受一个丑陋的解决方案。
  • @PhilFrost:这可能还是有可能的。如果您知道 ERB 用于输出的变量的名称,您可以直接连接到该名称。为了清楚起见,我在示例中明确命名了变量,但如果我站在你的立场上,我会尝试使用默认值 __erbout。如果他们不这样使用它,他们可能不会更改变量的名称。因此,不要使用print_into_ERB str,而是使用__erbout &lt;&lt; str
【解决方案2】:

这有什么问题:

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

【讨论】:

  • 一方面,它只是移动 噪音,另一方面,它在每个 key=value 对之前输出空格。
  • @PhilFrost 我怀疑你是否真的能避免ERB中的噪音
【解决方案3】:

尝试如下:

<%= [ '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 -%>

【讨论】:

  • 你说得对,ERB 中的代码太多了。制作一个可以调用的方法可以非常清楚地知道发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2015-05-17
相关资源
最近更新 更多