メッセージ機能作成時にためになった話
内容
PF作成の時にメンターさんに教えて頂いたことをいつもで引き出せるように書いておこうと思います。
メッセージ機能作成時にためになった時の話です。
users_controller.rb
:
def show
@user = User.find(params[:id])
unless @user.id == current_user.id
shared_room_info = Entry.shared_room_info(current_user, @user)
@isRoom = shared_room_info[:is_room]
@roomId = shared_room_info[:room_id]
unless @isRoom
@room = Room.new
@entry = Entry.new
end
end
end
:
@user = User.find(params[:id])
"params[:id]"を引数に"User"から情報を取得して、"@user"に入れます
unless @user.id == current_user.id
取得した"@user"のidが、"current_user"のidと違う場合に、条件文に入ります
shared_room_info = Entry.shared_room_info(current_user, @user)
"Entry"のclassメソッドの"shared_room_info"に"(current_user, @user)"を引数に呼び出します。
@isRoom = shared_room_info[:is_room]
@roomId = shared_room_info[:room_id]
"shared_room_info"からの返り値の"is_room"と"room_id"を"@isRoom"と"@roomId"に入れます
unless @isRoom
@room = Room.new
@entry = Entry.new
end
"@isRoom"がfalseの場合、条件文に入り、新しくuser同士のチャットルーム(Room.new)を作り、またuserとroomの中間テーブルにしている"Entry"を新しく作成(Entry.new)する事で、そのuserと作成したroomを紐づけます。
entry.rb
class Entry < ApplicationRecord
belongs_to :user
belongs_to :room
# チャットルームの有無確認
def self.shared_room_info(user1, user2)
user1.entries.includes(:room).each do |current_user_entry|
user2.entries.includes(:room).each do |user_entry|
if current_user_entry.room_id == user_entry.room_id
return {
is_room: true,
room_id: current_user_entry.room_id
}
end
end
end
{
is_room: false,
room_id: nil
}
end
end
def self.shared_room_info(user1, user2)
引数で渡した"(current_user, @user)"を、"(user1, user2)"で受け取ります。
user1.entries.includes(:room).each do |current_user_entry|
user2.entries.includes(:room).each do |user_entry|
if current_user_entry.room_id == user_entry.room_id
user1が持っている"entries"とuser2が持っている"entries"の"room_id"が一致する場合、条件文に入ります。
return {
is_room: true,
room_id: current_user_entry.room_id
}
"room_id"が一致する = user同士のチャットルームがあるという事のため、"is_room: true" = 部屋あります "room_id: current_user_entry.room_id" = 見つけた部屋のid を返り値で返します。
無かった場合は、falseを返し、新しく部屋を作るようにします。
まとめ
classメソッドやインスタンスメソッドを使って、controllerに記載する内容はなるべく少なくする方がいいと教えて頂いた時の話です。
classメソッドとインスタンスメソッドの使い分けが、理解できていないため、そこを深堀利していきたいと思います。
Discussion