在ERB中执行代码之前,如何清洁检查ruby哈希值是否存在?

时间:2019-03-27 21:19:18

标签: html ruby erb

我有一个XML对象,该对象已加载到Ruby哈希中。目的是在网页中显示来自Web服务的一些复杂XML。

棘手的是,根据从Web服务返回的XML数据,XML的外观可能有所不同。

我有ERB代码,看起来像这样...

...
<p>Name:</p><%= @some_hash['root']['data']['name'] %>
<table>
<tr><td><span class="label">Total:</span><%= @some_hash['root']['data']['subdata'] %></td></tr>
<tr><td><span class="label">Rate:</span><%= @some_hash['root']['data']['subdata1'] %></td></tr>
</table>
<table>
    <tr>
      <th>Column A</th>
      <th>Column B</th>
    </tr>

  <% @some_hash['root']['data']['subdata2'].each do |value| %>
    <tr>
      <td><%= @value['A'] %></td>
      <td><%= @value['B']  %></td>
      </tr>
  <% end %>
 </table>
...

我将“ @”放在变量前面以检查是否为零。那没什么大作用。我不确定这是否是最好的方法。如何干净地遍历ERB并仅在值存在时执行?

3 个答案:

答案 0 :(得分:2)

Hash#digsafe navigation operator将执行以下操作:

<% if subdata = @some_hash&.dig('root', 'data', 'subdata') %>
  <tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>

dig将尝试提取嵌套值,如果其中任何一部分不可用,则返回nil。如果&.为零,则安全导航运算符.dig会在调用@some_hash时防止NoMethodError。

答案 1 :(得分:2)

使用助手

def data_table(source)
  if subdata = source&.dig('root', 'data', 'subdata')
    h.content_tag :table do
      h.content_tag :tr do
         h.content_tag :td do
           h.content_tag :span, 'Total:'
           subdata
         end
      end
    end
  end
end

erb

<p>Name:</p><%= @some_hash['root']['data']['name'] %>
<%= data_table(@some_hash) %>

答案 2 :(得分:0)

<% if subdata = (@some_has || {}).dig('root', 'data', 'subdata') %>
  <tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>