Html 零能';不能转换为时间值
我正在建立一个基本的聊天室网站,其中有多个聊天室,用户可以对其进行评论 我设法让我的信息/评论显示在每个房间。显示页面,但当我进入时Html 零能';不能转换为时间值,html,ruby-on-rails,ruby,Html,Ruby On Rails,Ruby,我正在建立一个基本的聊天室网站,其中有多个聊天室,用户可以对其进行评论 我设法让我的信息/评论显示在每个房间。显示页面,但当我进入时 <p><%= message.user.name if message.user %> <small><em><%= "#{time_ago_in_words(message.created_at)} ago" %></em></small></p> 这是我的文件
<p><%= message.user.name if message.user %> <small><em><%= "#{time_ago_in_words(message.created_at)} ago" %></em></small></p>
这是我的文件
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。
消息。在
处创建的是nil
。您可以通过稍微更改代码来验证:
<%= "#{time_ago_in_words(message.created_at || Time.now)} ago" %>
这不会显示任何内容,因为在处创建的message.u是nil
<%= "#{time_ago_in_words(message.created_at)} ago" if message.created_at %>
我建议您使用调试库来帮助您解决这个问题。你可以这样做:
<% @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 %>
您还应该检查您的schema.rb
,以确保消息
模型具有以下内容:
t.datetime "created_at", null: false
t.index ["room_id"], name: "index_messages_on_room_id"
第一个是必需的,因为没有它,消息。在
处创建的将根本不存在,第二个是两个模型之间的关联所必需的
您的控制器代码没有任何意义,我假设您手动将其输入到问题中,而不是复制和粘贴它。您将@rooms
定义为ActiveRecord::Relation
集合对象,但调用@rooms.message
。如果您的意思是@rooms.message
,那么这将不起作用,因为您试图对集合调用实例方法。我不知道你在这里是什么意思,因为代码没有意义
此外,您没有实现一个。您的消息
控制器的显示
方法应用于呈现单个消息
对象,而不是呈现房间消息的集合
一般来说,您键入的代码、结构和示例存在许多问题。但至少,您必须确保在尝试用文字调用时间之前,在
处创建的message.created\u不是nil
,并且所有这些都可以追溯到:
- 确保您的模型正确形成并相互关联
- 确保控制器正在获取真实对象
- 确保视图在这些真实对象上进行了适当的迭代
应该是有很多:消息,不是吗?不幸的是,这并没有解决问题。谢谢你注意到这一点!我已经在代码中更正了它,但仍然收到相同的零错误。您确定在
值处创建了mesage.created\u吗?你能证明它不是零吗?@SheldonBishop你能更新你当前的代码来回答这个问题吗?我将进一步调查。我建议您查找您的迁移,它是否有时间戳
。另外,您是否尝试在rails控制台中获取值,以确保存储值。我添加了“| | Time.now”,它使所有内容都以正确的时间显示!非常感谢您的帮助。@SheldonBishop我认为它显示的时间不正确,这不是我给您的解释。我认为你没有抓住我提供的答案的要点,我认为你没有找到真正的解决办法。我建议你仔细重读我的帖子。我仔细阅读了你所说的内容,非常感谢你的深入解释。到目前为止,正确显示了创建评论的时间:2天前、1天前、24分钟前,等等。。。同样是的,我为我的信息控制器发布的代码实际上是我的房间控制器代码——也许这就是为什么它没有意义。我检查了我的模式文件,您建议的所有字段都存在。我已经安装了“再见虫”宝石。这样行吗?还是你认为我应该用pry?我不熟悉它,但如果你认为它更好,我很乐意尝试。再次感谢您的帮助,我正在查看我的房间控制器,试图按照建议使其更干燥。但是,当我将其从“message=room.messages”切换到“message=room.message”时,我收到了未定义的方法错误。我最初是这样做的,但意识到如果我使用messages vs message,它不会返回错误。我很高兴学习正确的方法,因为这将帮助我不仅仅是一个快速修复!
<% @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 %>
class Room < ApplicationRecord
has_many :messages
end
t.datetime "created_at", null: false
t.index ["room_id"], name: "index_messages_on_room_id"