在 ERB 中执行代码之前,如何清楚地检查 ruby 哈希值是否有值?
How do I cleanly check if a ruby hash has a value before executing code in ERB?
我有一个 XML 对象被加载到 Ruby 散列中。目标是在网页中显示来自 Web 服务的一些复杂 XML。
棘手的是 XML 看起来会有所不同,具体取决于从 Web 服务返回的 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 并仅在值存在时执行?
Hash#dig and the safe navigation operator 会这样做:
<% if subdata = @some_hash&.dig('root', 'data', 'subdata') %>
<tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>
dig
将尝试提取嵌套值,如果其中任何部分不可用则返回 nil。如果 @some_hash
为 nil,则安全导航运算符 &.
可防止在调用 .dig
时出现 NoMethodError。
使用助手
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) %>
<% if subdata = (@some_has || {}).dig('root', 'data', 'subdata') %>
<tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>
我有一个 XML 对象被加载到 Ruby 散列中。目标是在网页中显示来自 Web 服务的一些复杂 XML。
棘手的是 XML 看起来会有所不同,具体取决于从 Web 服务返回的 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 并仅在值存在时执行?
Hash#dig and the safe navigation operator 会这样做:
<% if subdata = @some_hash&.dig('root', 'data', 'subdata') %>
<tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>
dig
将尝试提取嵌套值,如果其中任何部分不可用则返回 nil。如果 @some_hash
为 nil,则安全导航运算符 &.
可防止在调用 .dig
时出现 NoMethodError。
使用助手
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) %>
<% if subdata = (@some_has || {}).dig('root', 'data', 'subdata') %>
<tr><td><span class="label">Total:</span><%= subdata %></td></tr>
<% end %>