message.created_at
- это nil
.Вы можете проверить это, слегка изменив свой код:
<%= "#{time_ago_in_words(message.created_at || Time.now)} ago" %>
Это всегда будет отображать less than a minute ago
, потому что message.created_at
равно nil
.
<%= "#{time_ago_in_words(message.created_at)} ago" if message.created_at %>
Это ничего не покажет, потому чтоmessage.created_at
is nil
.
Я предлагаю вам использовать библиотеку отладки, такую как pry
, чтобы помочь вам решить эту проблему.Вы можете сделать что-то вроде этого:
<% @message.each do |message| %>
<div class="row">
<% binding.pry unless message && message.created_at %>
<p><%= message.user.name if message.user %> <small><em><%= "#{time_ago_in_words(message.created_at)} ago" %></em></small></p>
<p><%= message.body %></p>
</div>
<% end %>
Это установит точку останова, которая будет срабатывать, если message
или message.created_at
равны nil
, и позволит вам использовать консоль Rails для проверки переменныхЧтобы помочь сузить проблему.
Как и другие упомянутые выше, вам необходимо убедиться, что ваши модели построены надлежащим образом:
class Room < ApplicationRecord
has_many :messages
end
Вы также должны проверить свой schema.rb
, чтобы убедиться, чтоМодель Message
имеет следующее:
t.datetime "created_at", null: false
t.index ["room_id"], name: "index_messages_on_room_id"
Первое необходимо, поскольку без него message.created_at
вообще не будет существовать, а второе необходимо для связи между двумя моделями.
Ваш код контроллера не имеет никакого смысла, и я предполагаю, что вы вручную ввели его в свой вопрос, а не копировали и вставляли его.Вы определяете @rooms
как ActiveRecord::Relation
объект коллекции, но вы вызываете @room.message
.Если вы имели в виду @rooms.message
, это не сработает, потому что вы пытаетесь вызвать метод экземпляра в коллекции.Я не уверен, что вы имели в виду, потому что код не имеет смысла.
Кроме того, вы не реализуете чистое решение CRUD .Ваш Messages
контроллер show
должен использовать метод для визуализации одного объекта Message
, а не для рендеринга набора сообщений комнат.
В общем, существует много проблем с кодом, структурой ипример, который вы напечатали.По крайней мере, вы должны убедиться, что message.created_at
не является nil
, прежде чем пытаться вызвать time_ago_in_words
, и что все трассы возвращаются к:
- , чтобы убедиться, что ваши модели правильно сформированыи связаны друг с другом
- , чтобы убедиться, что ваш контроллер выбирает реальные объекты
- , чтобы убедиться, что ваше представление соответствующим образом перебирает эти реальные объекты