トークルームにて発言を分ける際にやった事のメモです。
今回作ったのが、自作自演でLINEのようなチャットルームにて一人で交互に発言出来るアプリです。
その際にやった事は、roleカラムを作り
・role 0 なら Aさん
・role 1 なら Bさん
と分ける事で実装しました。
では実際にコードなどをみていきましょう。
まず発言を投稿するformです。
memo_room_idに紐づいた、memo_room_postとなるように、
memo_room_idを取れるようにmemo_room_postをルーティングでネストしてあります。
def new
@memo_room = MemoRoom.find(params[:memo_room_id])
@memo_room_post = MemoRoomPost.new
@memo_room_posts = @memo_room.memo_room_posts MemoRoomインスタンスのデータに紐づいた、memo_room_postsのデータ
@memo_room_post.memo_room_id = @memo_room.id 上記にmemo_room_idの値を入れてあげます。
end
<%= form_with(model: @memo_room_post, url: memo_room_memo_room_posts_url(@memo_room), local: true) do |f| %>
<%= render 'layouts/error_messages', model: f.object %>
<div class="form-group">
<%= hidden_field_tag :memo_room_id, @memo_room.id %>
<%= f.text_area :content, class: 'form-control chat-form', placeholder: "メモの内容を入れて投稿してください" %>
</div>
<%= button_tag :type => "submit", :class =>"btn btn-default btn-s-md" do %><i class="fas fa-paper-plane"></i>
<% end %>
<% end %>
</div>
<% else %>
ここからが今回のお話の中心です。
role分けをする際の主となる部分です。
def create
@memo_room_post = current_user.memo_room_posts.build(memo_room_post_params)
@memo_room = MemoRoom.find(params[:memo_room_id])
@memo_room_post.memo_room_id = @memo_room.id
#@memo_roomを使い、紐づいたMemoRoomPostインスタンスの最後の発言データを取得
@lastpost = @memo_room.memo_room_posts.last
if @lastpost == nil #MemoRoomに紐付いたMemoRoomPostの最後のデータ がnilなら
@memo_room_post.role = 0 #memo_room_postのrole を 0 にする。 開始位置 role 0
elsif @lastpost.role == 0 #MemoRoomに紐付いたMemoRoomPostの最後のデータのroleの値が0なら
@memo_room_post.role = 1 #memo_room_postのrole の値を 1にする。
elsif @lastpost.role == 1 ##MemoRoomに紐付いたMemoRoomPostの最後のデータのroleの値が 1なら
@memo_room_post.role = 0 #memo_room_postのroleの値を 0にする。
end
まずはconsoleにて・・・試すのですが。貼れるものがないので簡単に。
user = User.first
category = Category.first
@memo_room = user.memo_rooms.build(title: 'a', category_id: category.id) カテゴリとメモルームが紐づいてます。
@memo_room_post = current_user.memo_room_posts.build(content: 'a', memo_room_id: @memo_room.id)
こんな感じで@memo_room_post作ります。ルームのidは直接コンソールでは入れ込みます。
そして、@lastpost(わかりやすく変数名しただけに) = @memo_room.memo_room_posts.last
MemoRoomに紐づいたMemoRoomPostの最後の発言データを取得します。
トークルームの中で発言がない場合は当然nilになります。なので・・・
@lastpost == nil 最後の発言データがなくnilであるなら
@memo_room_post.role = 0 roleの値を0に。
以下略 上記のコード参照
これで、発言がない場合、roleが0の場合 roleが1の場合の記載が出来ました。
<% if memo_room_post.role == 0 %>
そしてview側では、roleの値 が一致するかしないかで、発言を分けるIF文を使い、表示分けを行いました。
実際のコードです。
html.erb
<div class="line-bc col-sm-12">
<!-- タイトル -->
<div class="line__title">
ルーム名:<%= @memo_room.title %>
</div>
<% @memo_room_posts.each do |memo_room_post| %>
<% if memo_room_post.role == 0 %> ここ ← --------
<div class="col-sm-12 balloon6">
<div class="faceicon">
<%= image_tag current_user.post_a_picture.to_s %>
</div>
<div class="chatting">
<div class='says'>
<p><%= memo_room_post.content %></p>
</div>
</div>
</div>
<% elsif memo_room_post.role == 1 %> ここ← -------
<div class="offset-sm-6 col-sm-6 mycomment">
<div class="faceicon">
<p><%= memo_room_post.content %></p><%= image_tag current_user.post_b_picture.to_s %>
</div>
</div>
<% end %>
<% end %>
メモ書きなので、省略してるところも多いと思いますが、似たような事をする際に
役に立てばと思います。以上