概要
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がしっかりとまだいるにもかかわらず、退会済のユーザーと表示しています。
すいません。下記回答は質問の意図を把握できていないため削除依頼をださせていただきました。
どちらでも良いとは思うのですが、Viewだと<% @rooms.zip(@anotherEntries) do |room,entry| %>のあとにif entry.user.present?とかで条件分岐すると良いかと思うのですが、いかがでしょうか?
<% if entry.nil? %>で条件分岐を行ったところ
退会したユーザーとのメッセージは表記しなくなったのですが、
何か違和感があると思い、色々と調べたところ、応募したてのメッセージや最新のメッセージもuserが入っていないとし、消されてしまいました。
退会もしていないのにもかかわらず、最新のメッセージだけが退会userのメッセージと同じくカウントされてしまうのはifが悪いのでしょうか?
それともcontorllerが悪いのでしょうか?
下記で試してみていただけますか?
<% @rooms.zip(@anotherEntries) do |room,entry| %>
<% if entry.nil? %>
<% else %>
<% if entry.user.present? %> ←投稿した人の有無を確認
:
<% end %>
試したのですが、変化はありませんでした。
掲載から、メッセージに飛ぶこともできるので、そこから条件分岐で除外されているメッセージを確認したところ、中にしっかりと2人のユーザーが入っているので、_room.html.erb内か、コントローラーの_room.html.erbへのデータの受け渡し方が問題なのでしょうか?
今、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>
新しく分かったのですが、一番上のメッセージが見れず、おかしいのでデータの表示か受け渡しがおかしいのかなと思っていますが合っていますか?
とりあえず退会機能で書いていたモデルm割の関連定義を元に戻したところ、退会者さけ外し、リンクもうまく繋げたかもしれません。
ありがとうございます。
回答1件
あなたの回答
tips
プレビュー