RoR вызывает метод в цикле, когда коллекция пуста

#ruby-on-rails #ruby #erb

#ruby-on-rails #ruby #ошибка

Вопрос:

У меня есть .каждый цикл в представлении, который продолжает пытаться выполнить итерацию по пустой коллекции. Когда он пытается пройти цикл, он выдает ошибку при попытке вызвать метод для объекта, который не существует. Я даже пытался поместить цикл внутри оператора 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. Консоль даже показывает, что коллекция пуста. Причина, по которой отображаемая запись не найдена, заключается в том, что image на самом деле является методом экземпляра Card, который получает изображение из объекта Code, но проблема в том, что image вызывается в первую очередь.

Я также показал размер коллекции в представлении, и он показал 1, но когда я попытался показать идентификатор первой или последней коллекции, ничего не отобразилось.

Комментарии:

1. пожалуйста, добавьте оба представления и оба контроллера и точную ошибку

2. Я только что добавил действие контроллера, а также некоторую дополнительную информацию.

Ответ №1:

Условный

Для решения проблем такого типа вы также можете использовать условный оператор, чтобы проверить, заполнен ли collection :

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

Да, это добавляет уровень сложности, но если вы не знаете, будет ли ваша @instance variable заполнена, это позволит вам сосредоточиться на создании пользовательского интерфейса без исключений 🙂

Ответ №2:

Проблема заключалась в новой карточке, которую я создавал в действии show. Он добавлялся в коллекцию, поэтому я изменил его на @card = Card.new .