前提・実現したいこと
Ruby on Rails初学者です。Railsのアプリを作成中で、その中でDM機能を実装しようとしているのですが、うまくいきません。
詳しい方、ご教示下さるととても助かります。
発生している問題・エラーメッセージ
LINEのメッセージように、友達一覧のページがあり、特定の人の欄をクリックすると、その人とのチャットルームのページに遷移される機能を作っており、下記のようにコーディングしてみました。followings(ユーザーがフォローしている人達)をeachで繰り返し、中間テーブルである、Entryの同じものを既に持っているかどうかで場合分けしています。
発生している問題としては、どのユーザーの欄をクリックしたとしても、rooms/1という、最初に作られたチャットルームにしか遷移されません。それぞれのユーザーとのチャットルームを作りたい場合どのように変更すれば良いでしょうか?
該当のソースコード
indexhtmlerb
1<% @followings.each do |following| %> 2 <% 3 @userEntries = Entry.where(user_id: following.id) 4 unless following.id == current_user.id 5 @currentUserEntries.each do |ce| 6 @userEntries.each do |ue| 7 if ce.room_id == ue.room_id 8 @isRoom = true 9 @roomId = ce.room_id 10 end 11 end 12 end 13 unless @isRoom 14 @room = Room.new 15 @entry = Entry.new 16 end 17 end 18 %> 19 <ul class="collection"> 20 <% if @isRoom %> 21 <%= link_to room_path(@roomId) do %> 22 <li class="collection-item avatar"> 23 <% if following.avatar.attached? %> 24 <%= image_tag following.avatar, class: 'circle' %> 25 <% else %> 26 <%= image_tag 'default_user.png', class: 'circle' %> 27 <% end %> 28 <span class="title"><%= following.username %></span> 29 <p>First Line</p> 30 <a href="#!" class="secondary-content"><i class="material-icons">grade</i></a> 31 </li> 32 <% end %> 33 <% else %> 34 <%= form_with model: @room, local: true do |f| %> 35 <%= fields_for @entry do |e| %> 36 <%= e.hidden_field :user_id, value: following.id %> 37 <% end %> 38 <label for="make-room"> 39 <li class="collection-item avatar"> 40 <% if following.avatar.attached? %> 41 <%= image_tag following.avatar, class: 'circle' %> 42 <% else %> 43 <%= image_tag 'default_user.png', class: 'circle' %> 44 <% end %> 45 <span class="title"><%= following.username %></span> 46 <p>First Line</p> 47 <a href="#!" class="secondary-content"><i class="material-icons">grade</i></a> 48 </li> 49 <%= f.submit id: 'make-room', class: 'hide' %> 50 </label> 51 <% end %> 52 <% end %> 53 </ul> 54 <% end %> 55
rooms_controller
1class RoomsController < ApplicationController 2 before_action :authenticate_user! 3 def index 4 @followings = current_user.followings 5 @currentUserEntries = Entry.where(user_id: current_user.id) 6 end 7 8 def show 9 end 10 11 def create 12 room = Room.create 13 Entry.create(user_id: current_user.id, room_id: room.id) 14 Entry.create(user_id: params[:entry][:user_id], room_id: room.id) 15 redirect_to room 16 end 17end 18
schemarb
1create_table "entries", force: :cascade do |t| 2 t.integer "user_id" 3 t.integer "room_id" 4 t.datetime "created_at", null: false 5 t.datetime "updated_at", null: false 6 t.index ["room_id"], name: "index_entries_on_room_id" 7 t.index ["user_id"], name: "index_entries_on_user_id" 8 end 9 10create_table "rooms", force: :cascade do |t| 11 t.datetime "created_at", null: false 12 t.datetime "updated_at", null: false 13 end 14 15create_table "users", force: :cascade do |t| 16 t.string "email", default: "", null: false 17 t.string "encrypted_password", default: "", null: false 18 t.string "reset_password_token" 19 t.datetime "reset_password_sent_at" 20 t.datetime "remember_created_at" 21 t.integer "sign_in_count", default: 0, null: false 22 t.datetime "current_sign_in_at" 23 t.datetime "last_sign_in_at" 24 t.string "current_sign_in_ip" 25 t.string "last_sign_in_ip" 26 t.datetime "created_at", null: false 27 t.datetime "updated_at", null: false 28 t.string "username" 29 t.string "profile" 30 t.index ["email"], name: "index_users_on_email", unique: true 31 t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 32 end 33 34
補足情報(FW/ツールのバージョンなど)
Ruby 2.6.5
Rails 5.2.1
質問のコードに不足などあれば、都度記述させて頂きます。
あなたの回答
tips
プレビュー