LoginSignup
0
0

More than 3 years have passed since last update.

発言(post)をroleカラムを使い分ける

Posted at

トークルームにて発言を分ける際にやった事のメモです。

今回作ったのが、自作自演で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 %>

メモ書きなので、省略してるところも多いと思いますが、似たような事をする際に
役に立てばと思います。以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0