Как правильно проверить, имеет ли значение хэш ruby ​​перед выполнением кода в ERB? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть объект XML, который загружен в хэш Ruby.Цель состоит в том, чтобы отобразить на веб-странице несколько сложных XML-данных из веб-службы.

Хитрость заключается в том, что XML может выглядеть по-разному в зависимости от того, какие данные XML возвращаются из веб-службы.

Iу меня есть код 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 ]

2 голосов
/ 28 марта 2019

Используйте помощника

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

эрб

<p>Name:</p><%= @some_hash['root']['data']['name'] %>
<%= data_table(@some_hash) %>
2 голосов
/ 28 марта 2019

Hash # dig и оператор безопасной навигации сделает это:

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

dig попытается извлечь вложенное значение, возвращая ноль, еслилюбая его часть недоступна.Оператор безопасной навигации &. предотвращает ошибку NoMethodError при вызове .dig, если @some_hash равно nil.

0 голосов
/ 28 марта 2019
<% if subdata = (@some_has || {}).dig('root', 'data', 'subdata') %>
  <tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>
...