ActiveRecord ::RecordNotFound в StaticPagesController#home

#ruby #ruby-on-rails-3

#ruby #ruby-on-rails-3

Вопрос:

Я получаю эту ошибку всякий раз, когда пытаюсь получить доступ к приложению. Ошибка связана с контроллером приложения. Это ошибка. Не удалось найти все личные :: беседы с ‘id’: (17, 38) (найдено 0 результатов, но искал 2).

Ошибка более подробно объясняется в bash следующим образом ActiveRecord::RecordNotFound (Не удалось найти все личные :: беседы с ‘id’: (17, 38) (найдено 0 результатов, но искал 2).):

app / controllers/application_controller.rb:28:в `opened_conversations_windows’ я попытался изменить метод поиска, но, похоже, что-то не работает с такими методами, как find_by.

 def opened_conversations_windows


        if logged_in?

            # opened conversations

            session[:private_conversations] ||= []

            @private_conversations_windows = Private::Conversation.includes(:recipient, :messages)
                                              .find(session[:private_conversations])



          else

            @private_conversations_windows = []


        end
end
  

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

Ответ №1:

find предназначен для выдачи ошибки, если запись для данного идентификатора не найдена.

Если вы не хотите вызывать ошибку, вы можете использовать, find_by когда хотите найти одну запись или вернуть, nil когда эта запись не существует. Или вы можете создать запрос с where , который всегда возвращает массив совпадающих записей в пустом массиве, если есть какие-либо совпадающие записи.

Вы можете реорганизовать свой метод, чтобы:

 def opened_conversations_windows
  if logged_in? amp;amp; session[:private_conversations]
    @private_conversations_windows = Private::Conversation
                                       .includes(:recipient, :messages)
                                       .where(id: session[:private_conversations])
  else
    @private_conversations_windows = []
  end
end