質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

332閲覧

片方のuserがいないときのDM一覧

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

0クリップ

投稿2022/10/19 16:42

編集2022/10/26 10:14

概要

1.物理削除式の退会機能を作成。

2.DM機能の部屋にあたるroomは削除できない。

3.そのため相手方のDM一覧ではuserに関するエラーが発生した。

4.userが片方だけ残った時のDMは表示させないようにするためにはcontrollerとviewsどちらでifをかけるとよいのかわからない。

発生している問題・エラーメッセージ

NoMethodError at /rooms undefined method `user' for nil:NilClass Hint: Something is `nil` when it probably shouldn't be. block in _app_views_rooms__room_html_erb__2669934277696239725_72660app/views/rooms/_room.html.erb <% @rooms.zip(@anotherEntries) do |room,entry| %> <div class="dm-list-box"> <div class="dm-list-conent"> <div class="dm-list-user-name"> <h5>相手:</h5> <p><%= link_to entry.user.name, user_path(entry.user), class: "text-decoration-none" %></p><br /> ←エラー箇所 </div> <div class="dm-list-plan-name"> <h5>掲載名:</h5> <p><%= link_to room.room_name, plan_path(room.plan_id), class: "text-decoration-none" %></p> </div>

該当のソースコード

views/rooms/index.html.erb

1<div class="dm-list"> 2 <h4>メッセージ一覧</h4> 3 <p><%= render 'room', rooms: @rooms %></p> 4</div>

views/rooms/_room.html.erb

1<div> 2 <% @rooms.zip(@anotherEntries) do |room,entry| %> 3 <% if entry.nil? %> 4 <% else %> 5 <div class="dm-list-box"> 6 <div class="dm-list-conent"> 7 <div class="dm-list-user-name"> 8 <h5>相手:</h5> 9 <p><%= link_to entry.user.name, user_path(entry.user), class: "text-decoration-none" %></p><br /> 10 </div> 11 <div class="dm-list-plan-name"> 12 <h5>掲載名:</h5> 13 <p><%= link_to room.room_name, plan_path(room.plan_id), class: "text-decoration-none" %></p> 14 </div> 15 </div> 16 <div class="dm-list-btn"> 17 <p><%= link_to 'メッセージ', room, class: "btn btn-outline-danger btn-lg" %></p> 18 </div> 19 </div><br /> 20 <% end %> 21 <% end %> 22 <div class="d-flex justify-content-center mb-2"> 23 <%== pagy_bootstrap_nav(@pagy) %> 24 </div> 25</div> 26

rooms_controller.rb/indexアクション

1def index 2 @pagy,@rooms = pagy(Room.all.select(:id,:room_name,:plan_id), items:10) 3 @currentEntries = current_user.entries 4 myRoomIds = [] 5 6 @currentEntries.each do |entry| 7 myRoomIds << entry.room.id 8 end 9 10 @anotherEntries = Entry.where(room_id: myRoomIds).where('user_id != ?',current_user.id) 11 12 end

下のメッセージが2人のuserがしっかりとまだいるにもかかわらず、退会済のユーザーと表示しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

no1knows

2022/10/21 00:25

すいません。下記回答は質問の意図を把握できていないため削除依頼をださせていただきました。 どちらでも良いとは思うのですが、Viewだと<% @rooms.zip(@anotherEntries) do |room,entry| %>のあとにif entry.user.present?とかで条件分岐すると良いかと思うのですが、いかがでしょうか?
退会済みユーザー

退会済みユーザー

2022/10/21 04:10

<% if entry.nil? %>で条件分岐を行ったところ 退会したユーザーとのメッセージは表記しなくなったのですが、 何か違和感があると思い、色々と調べたところ、応募したてのメッセージや最新のメッセージもuserが入っていないとし、消されてしまいました。 退会もしていないのにもかかわらず、最新のメッセージだけが退会userのメッセージと同じくカウントされてしまうのはifが悪いのでしょうか? それともcontorllerが悪いのでしょうか?
no1knows

2022/10/21 05:05

下記で試してみていただけますか? <% @rooms.zip(@anotherEntries) do |room,entry| %> <% if entry.nil? %> <% else %> <% if entry.user.present? %> ←投稿した人の有無を確認   : <% end %>
退会済みユーザー

退会済みユーザー

2022/10/21 06:37 編集

試したのですが、変化はありませんでした。 掲載から、メッセージに飛ぶこともできるので、そこから条件分岐で除外されているメッセージを確認したところ、中にしっかりと2人のユーザーが入っているので、_room.html.erb内か、コントローラーの_room.html.erbへのデータの受け渡し方が問題なのでしょうか?
退会済みユーザー

退会済みユーザー

2022/10/21 06:49

今、userがいない場合に”退会済のユーザー”と表記させるようなコードで試したところ、 しっかりと中にuserがいるにもかかわらず上記の表示をしました。 試した、コード <div> <% @rooms.zip(@anotherEntries) do |room,entry| %> <div class="dm-list-box"> <div class="dm-list-conent"> <div class="dm-list-user-name"> <h5>相手:</h5> <% if entry.nil? %> <p>退会済みのユーザー</p> <% else %> <p><%= link_to entry.user.name, user_path(entry.user), class: "text-decoration-none" %></p><br /> <p><%= link_to entry.user.name, user_path(entry.user), class: "text-decoration-none" %></p><br /> <% end %> </div> <div class="dm-list-plan-name"> <h5>掲載名:</h5> <p><%= link_to room.room_name, plan_path(room.plan_id), class: "text-decoration-none" %></p> </div> </div> <div class="dm-list-btn"> <p><%= link_to 'メッセージ', room, class: "btn btn-outline-danger btn-lg" %></p> </div> </div><br /> <% end %> <div class="d-flex justify-content-center mb-2"> <%== pagy_bootstrap_nav(@pagy) %> </div> </div>
退会済みユーザー

退会済みユーザー

2022/10/21 08:58

新しく分かったのですが、一番上のメッセージが見れず、おかしいのでデータの表示か受け渡しがおかしいのかなと思っていますが合っていますか?
退会済みユーザー

退会済みユーザー

2022/10/21 10:10

とりあえず退会機能で書いていたモデルm割の関連定義を元に戻したところ、退会者さけ外し、リンクもうまく繋げたかもしれません。 ありがとうございます。
guest

回答1

0

ベストアンサー

<% if entry.nil? %>で条件分岐を行い、ユーザーがいないときのメッセージ一覧の表示を変えることができました。

投稿2022/10/21 10:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問