【问题标题】:NoMethodError (undefined method `created_at' for nil:NilClass)NoMethodError(nil:NilClass 的未定义方法“created_at”)
【发布时间】:2017-03-01 15:26:33
【问题描述】:

我的conversations_controller 中有以下 Rails 代码:

用户可能是:masterrookie

@conversations = current_user.master.conversations.all
@conversations = @conversations.sort_by { |c| c.messages.last.created_at }.reverse

但在运行此程序时,我得到了一个 no method error 用于 created_at。 如果我这样做 puts 是这样的:

puts "Sorted: #{@conversations.map { |c| c.messages.last}}"

这给了我以下响应:

Sorted: [#<Message id: 9, content: "some content", user_id: 3, conversation_id: 1, created_at: "2017-03-01 00:00:36", updated_at: "2017-03-01 00:00:36", attachment_url: []>, nil, #<Message id: 11, content: "new message", user_id: 3, conversation_id: 6, created_at: "2017-03-01 15:15:58", updated_at: "2017-03-01 15:15:58", attachment_url: []>]

如果我收到created_at,那么为什么我不能提取最后的消息created_At 进行比较和排序?

关于做一个简单的

puts "The conversations sorted are: #{@conversations.map { |c| c.messages}}"

给我以下回应:

The conversations sorted are: [#<ActiveRecord::Associations::CollectionProxy [#<Message id: 1, content: "Hey there! This is my first message.", user_id: 1, conversation_id: 1, created_at: "2017-02-28 23:57:46", updated_at: "2017-02-28 23:57:46", attachment_url: []>, #<Message id: 2, content: "Thank you for your message. I am a coach.", user_id: 3, conversation_id: 1, created_at: "2017-02-28 23:57:46", updated_at: "2017-02-28 23:57:46", attachment_url: []>, #<Message id: 9, content: "adsdadasd", user_id: 3, conversation_id: 1, created_at: "2017-03-01 00:00:36", updated_at: "2017-03-01 00:00:36", attachment_url: ["https://ace-up-www.s3.amazonaws.com/message-attachments%2Fbd450b1e-f85c-47ec-94c7-c539809f8d68%2Frecommendation-bg.jpg"]>]>, #<ActiveRecord::Associations::CollectionProxy []>, #<ActiveRecord::Associations::CollectionProxy [#<Message id: 10, content: "Add a new message", user_id: 8, conversation_id: 6, created_at: "2017-03-01 14:58:29", updated_at: "2017-03-01 14:58:29", attachment_url: []>, #<Message id: 11, content: "new message", user_id: 3, conversation_id: 6, created_at: "2017-03-01 15:15:58", updated_at: "2017-03-01 15:15:58", attachment_url: []>]>]

如您所见,有一个空的#&lt;ActiveRecord::Associations::CollectionProxy []&gt;,它可能正在翻译为nil。 调试这个有什么帮助吗?

【问题讨论】:

  • 数组中有nil的值,就在这里... updated_at: "2017-03-01 00:00:36", attachment_url: []&gt;, nil, #&lt;Message id: 11...,看到nil了吗?
  • @fanta 你是对的,我在发布问题后注意到了同样的事情,所以我编辑了我的问题以添加更多细节。
  • 为什么不试试@conversations = current_user.master.conversations.joins(:messages).order("messages.created_at DESC") 之类的东西?这样你的代码会更快。
  • 这将返回多个对话对象。对话中的每条消息都有一个。您可以添加 .distinct 来解决此问题。

标签: ruby-on-rails ruby-on-rails-4 controller nomethoderror


【解决方案1】:

当您尝试获取实际没有任何消息的转换最后一条消息的 created at 属性时发生错误。

@conversations = current_user.master.conversations.joins(:messages)
@conversations = @conversations.sort_by { |c| c.messages.last.created_at }.reverse

通过将消息与对话相结合,只会检索至少包含一条消息的对话,因此我认为问题得到解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 2013-01-14
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多