#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
.