Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails在记录集上循环时跳过nil对象_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

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
中不存在,该怎么办?@titan
booking.child
返回
nil
,并
尝试
child
返回
nil
。哦,对了!我的错误,当使用
nil
调用
name
时发生错误。谢谢你,伙计。在你的第一个解决方案中,如果
child
对象不存在于
booking
?@titan
booking。child
返回
nil
,并
尝试
child
返回
nil
。哦,对了!我的错误,当使用
nil
调用
name
时发生错误。谢谢你,伙计。