当集合为空时,RoR在循环中调用方法

时间:2014-07-04 03:50:06

标签: ruby-on-rails ruby erb

我在视图中有一个.each循环,它不断尝试迭代空集合。当它试图通过循环时,它会在尝试调用不存在的对象上的方法时抛出错误。我甚至尝试将循环放在if语句中测试集合的大小/空白,但它仍然给出了同样的错误。

导致ActiveRecord::RecordNotFound (Couldn't find Code without an ID):

的代码
<% @game_board.cards.each do |card| %>
    <%= image_tag card.image %>
<% end %>

控制器操作:

def show
  @game_board = GameBoard.find(params[:id])
  @card = @game_board.cards.new
end

这个相同的代码实际上是在另一个视图中但工作正常,两个视图都给出了相同的@game_board对象。控制台甚至显示该集合为空。它没有找到显示记录的原因是图像实际上是Card的实例方法,它从Code对象获取图像,但问题是图像首先被调用。

我还在视图中显示了集合的大小,它显示了1,但是当我尝试显示集合的第一个或最后一个的ID时,没有渲染。

2 个答案:

答案 0 :(得分:1)

<强>条件

对于此类问题,您还可以使用条件语句来查看是否填充了collection

#app/views/controllers/your_view.html.erb
<% if @game_boards.present? %>
   <% @game_boards.each do |game| %>
       ...
   <% end %>
<% end %>

是的,它增加了一定程度的复杂性,但如果你不知道你的@instance variable是否会被填充,那么它将让你专注于为用户创建一个无异常的体验:)

答案 1 :(得分:0)

问题是我在show动作中创建的新卡。它被添加到集合中,因此我将其更改为@card = Card.new