Ruby on rails Rails在记录集上循环时跳过nil对象
您好,我想知道是否有人可以告诉我一个更优雅的方式做下面的 我有一个记录集,其中可能包含嵌套的值,也可能不包含嵌套的值,我正在努力显示信息,同时在空引用上循环,接收“不存在为零”错误 我知道我可以通过先检查来修复它,只是想知道是否应该有一种我不知道的更干净的方法 当前代码:(可能包括也可能不包括子项)Ruby on rails Rails在记录集上循环时跳过nil对象,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,您好,我想知道是否有人可以告诉我一个更优雅的方式做下面的 我有一个记录集,其中可能包含嵌套的值,也可能不包含嵌套的值,我正在努力显示信息,同时在空引用上循环,接收“不存在为零”错误 我知道我可以通过先检查来修复它,只是想知道是否应该有一种我不知道的更干净的方法 当前代码:(可能包括也可能不包括子项) @bookings.each do| booking| 潜在的解决办法 @bookings.each do |booking| <tr> <td><%=
@bookings.each do| booking|
潜在的解决办法
@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>
@bookings.each do| booking|
提前感谢。上述解决方法打破了表格布局(每行的表格数据单元格数量应该相同,或者应该涉及某种
colspan
)。可以将标准rails方法用于:
@bookings.each do| booking|
另一种方法是在没有找到子项时打印更具描述性的内容:
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child && booking.child.name || 'N/A' %></td>
</tr>
@bookings.each do| booking|
上述解决方法打破了表格布局(每行的表格数据单元格数量应该相同,或者应该涉及某种colspan
)。可以将标准rails方法用于:
@bookings.each do| booking|
另一种方法是在没有找到子项时打印更具描述性的内容:
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child && booking.child.name || 'N/A' %></td>
</tr>
@bookings.each do| booking|
您应该阅读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 %>
您应该阅读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 %>
如果您使用的是Ruby2.3,您可以使用安全导航操作符
&
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child&.name %></td>
</tr>
@bookings.each do| booking|
请参阅:如果您使用的是Ruby2.3,则可以使用安全导航操作符&.
,以获得更优雅的效果
@bookings.each do |booking|
<tr>
<td><%= booking.name %></td>
<td><%= booking.parent.name %></td>
<td><%= booking.child&.name %></td>
</tr>
@bookings.each do| booking|
请参阅:使用NullObject模式,以防止将来重复。
像这样的
class Booking
def child
super || NullChild.new
end
end
class NullChild
def name
end
end
使用NullObject模式,以防止将来重复。
像这样的
class Booking
def child
super || NullChild.new
end
end
class NullChild
def name
end
end
try
ing:如果booking
为nil
,则child
是无意义的,它将在上面两行引发一个错误。@Stewart明确提到的:child
可能包含在其中,也可能不包含在其中,这就是为什么他需要尝试:child
@Stewart尝试调用public方法,其名称作为第一个参数,就像public\u send一样,除了如果接收者没有响应,呼叫将返回nil而不是引发异常。try
ing:child
是无意义的,如果booking
是nil
,它将在上面两行引发一个错误。@Stewart明确提到的:child
可能包含在其中,也可能不包含在其中,这就是为什么他需要尝试:child
@Stewart尝试调用public方法,其名称作为第一个参数,就像public\u send一样,但如果接收方没有响应,则调用将返回nil,而不是引发异常。在第一个解决方案中,如果child
对象在booking
中不存在,该怎么办?@titanbooking.child
返回nil
,并尝试child
返回nil
。哦,对了!我的错误,当使用nil
调用name
时发生错误。谢谢你,伙计。在你的第一个解决方案中,如果child
对象不存在于booking
?@titanbooking。child
返回nil
,并尝试child
返回nil
。哦,对了!我的错误,当使用nil
调用name
时发生错误。谢谢你,伙计。