2017-03-01 5 views
1

Ich habe folgende Rails Code in meinem conversations_controller:NoMethodError (nicht definierte Methode `created_at‘ für nil: NilClass)

Ein Benutzer kann: master oder rookie.

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

Aber das auf Lauf Ich bin ein no method error für created_at bekommen. Wenn ich ein puts wie folgt aus:

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

das gibt mir die folgende Antwort:

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: []>] 

Wenn ich erhalte created_at dann warum kann ich nicht die letzten Meldungen created_At extrahieren, zu vergleichen und Sortieren?

auf einem einfachen

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

tun gibt mir die folgende Antwort:

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: []>]>] 

Wie man dort sehen kann eine leere #<ActiveRecord::Associations::CollectionProxy []> ist, die wahrscheinlich zu nil übersetzt zu werden. Haben Sie Hilfe beim Debuggen?

+0

Es gibt 'nil' Werte im Array, hier '... updated_at:" 2017-03-01 00:00:36 ", attachment_url: []>, nil, # fanta

+0

@fanta du bist richtig und ich habe das gleiche bemerkt, nachdem ich die Frage gepostet habe, also habe ich meine Frage bearbeitet, um weitere Details hinzuzufügen. – anonn023432

+0

Warum versuchen Sie nicht etwas wie '@conversations = current_user.master.conversations.joins (: messages) .order (" messages.created_at DESC ")' ?, so wird Ihr Code schneller. – fanta

Antwort

1

Der Fehler ist aufgetreten, wenn Sie versucht haben, das Attribut create at the converstions last zu erhalten, das tatsächlich keine Nachrichten enthält.

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

die Nachrichten mit den Gesprächen nur das Gespräch mit atleast einer Nachricht Mit dem Beitritt wird so durch, dass ich das Problem behoben bekommen denke abgerufen werden.

Verwandte Themen