嗨,我想知道是否有人能告诉我一个更优雅的方式来做下面的事情。
我有一个记录集,其中嵌套值可能包含也可能不包含在内,我正在努力显示信息,同时循环显示空值,接收nil错误时不存在。
我知道我可以通过先检查来修复它,只是想知道是否应该有一种我不知道的清洁方式。
当前代码:(儿童可能包括也可能不包括在内)
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child.name %></td>
</tr>
潜在的解决方法。
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<% if !booking.child_id.nil? %>
<td><%= booking.child.name %></td>
<% end %>
</tr>
提前致谢。
答案 0 :(得分:2)
上面的解决方法打破了表格布局(表格数据单元格的数量应该在每一行中相同,或者应该涉及有点colspan
。)。有人可能会使用标准导轨方法#try
:
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child.try(:name) %></td>
</tr>
另一种方法是在没有找到孩子的情况下打印更具描述性的内容:
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child && booking.child.name || 'N/A' %></td>
</tr>
答案 1 :(得分:2)
如果您使用的是Ruby2.3,则可以使用the safe navigation operator
&.
来获得更优雅的效果。
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child&.name %></td>
</tr>
答案 2 :(得分:1)
你应该读一下ruby .try()
。在你的情况下,这应该工作
<% @bookings.each do |booking| %>
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child.try(:name) %></td>
</tr>
<% end %>
作为替代方案,您可以使用Rescue
<%= booking.child.name rescue nil %>
答案 3 :(得分:0)
使用NullObject模式,以防止将来出现重复。 这样的事情。
class Booking
def child
super || NullChild.new
end
end
class NullChild
def name
end
end