ноль не может быть преобразовано в значение времени - PullRequest
0 голосов
/ 01 октября 2018

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

Мне удалось отобразить свои сообщения / комментарии на каждой странице Room.show, однако, когда я захожу, чтобы войти

<p><%= message.user.name if message.user %> <small><em><%= "#{time_ago_in_words(message.created_at)} ago" %></em></small></p>

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

Вот раздел моего Room.show.html.erb, в котором регистрируется ошибка

<% @message.each do |message| %>
  <div class="row">
    <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 %>

Вот мой контроллер сообщений

    def show
      @rooms = Room.all
      @message = @room.message
    end

Вот мой файл Routes

    Rails.application.routes.draw do
        devise_for :users
        #resources :messages
        resources :users
        resources :rooms do
          resources :messages
        end

        root 'rooms#index'

    end

Message.rb

        class Message < ApplicationRecord
           belongs_to :user
           belongs_to :room
        end

И room.rb

          class Room < ApplicationRecord
             has_many :message
          end

Использование обновленной версии rails.

1 Ответ

0 голосов
/ 03 октября 2018

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, и что все трассы возвращаются к:

  • , чтобы убедиться, что ваши модели правильно сформированыи связаны друг с другом
  • , чтобы убедиться, что ваш контроллер выбирает реальные объекты
  • , чтобы убедиться, что ваше представление соответствующим образом перебирает эти реальные объекты
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...