前提・実現したいこと
LINEのようなメッセージ機能を持つ「トークルーム一覧」において、メッセージが作成された順で各トークルームを降順に並べ替える実装を施しました。
しかし、メッセージの授受がまだ行われていないトークルームをユーザーが保持している場合、そのユーザーのトークルーム画面はエラー表示になると言う問題が起こっています。
空のトークルームデータを削除し、メッセージのやり取りのあるトークルームのみを残すと、エラーメッセージもなくページが正常に表示されます。
該当のソースコード
Rooms_controller.rb
Ruby
1 def set_another_entries 2 # ログイン中のユーザーの持つEntryを配列にする。 3 my_room_ids = @current_user.entries.pluck(:room_id) 4 # 上で定義した「ログイン中のユーザーの持つEntry」の内、「@current_userと異なるuser_id」、つまり自分以外の相手一覧を表示する。 5 @another_entries = Entry.includes(:user, :room).where(room_id: my_room_ids).where('entries.user_id != ?', @current_user.id) 6 7 # エントリーを配列にし、各エントリーを「メッセージが作成された順」で並べ替える。reverseでエントリーを降順にする。 8 @entries = @another_entries.to_a.compact!.sort_by {|entry| entry.messages.order(created_at: :desc).first&.created_at}.reverse 9 end
NoMethodError in RoomsController#index undefined method `sort_by' for nil:NilClass Extracted source (around line #67): 66 67 @entries = @another_entries.to_a.compact!.sort_by {|entry| entry.messages.order(created_at: :desc).first&.created_at}.reverse 68
※Entry
とは User
と Room
を繋ぐ中間テーブルで、これをビューにて繰り返し表示しています。
ここに至るまでの過程
ここに至るまでにも何度かエラーが出てきましたので、どのように対策したかを書いていきます。
①最初、該当のコードは以下の記述でした。
ruby
1@entries = @another_entries.to_a.sort_by {|entry| entry.messages.order(created_at: :desc).first.created_at}.reverse
NoMethodError in RoomsController#index undefined method `created_at' for nil:NilClass Extracted source (around line #67): 66 67 @entries = @another_entries.to_a.sort_by {|entry| entry.messages.order(created_at: :desc).first.created_at}.reverse 68
②created_at
がnilと言う事だったので、その前に&.
を付けました。
ruby
1@entries = @another_entries.to_a.sort_by {|entry| entry.messages.order(created_at: :desc).first&.created_at}.reverse
ArgumentError in RoomsController#index comparison of NilClass with ActiveSupport::TimeWithZone failed Extracted source (around line #67): 66 67 @entries = @another_entries.to_a.sort_by {|entry| entry.messages.order(created_at: :desc).first&.created_at}.reverse 68
③配列に格納されている要素の中で「nil」がある事が原因(?)と思ったので、これを取り除く compact
メソッドを使いました。
ruby
1@entries = @another_entries.to_a.compact!.sort_by {|entry| entry.messages.order(created_at: :desc).first.created_at}.reverse
NoMethodError in RoomsController#index undefined method `sort_by' for nil:NilClass Extracted source (around line #67): 66 67 @entries = @another_entries.to_a.compact!.sort_by {|entry| entry.messages.order(created_at: :desc).first&.created_at}.reverse 68
ここで冒頭にも記述致しましたエラー文が表示され、対策が分からず足踏みしている状況です。
どなたかご助言頂けますと有難いです。
補足情報(FW/ツールのバージョンなど)
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/30 11:19