6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsでグループ機能(掲示板)を作ってみた

Posted at

Railsでグループ機能(掲示板風)の作成

<開発環境>

  1. ruby 2.6.3
  2. Rails 5.1.6
  3. AWS Cloud9
  4. GitHub
  5. sqlite3(develop環境)

設計構想

ユーザーは自由にグループを作成でき、また他のユーザーが作成したグループに所属することもできます。
また、グループに参加したメンバーはグループ内で自由に発言することも可能になります。

この仕組みをテーブルに落とし込むと、
ユーザーとグループは多対多の関係になるので中間テーブルを用いることとします。
そして、ユーザーとグループ内での投稿も多対多の関係となる為、こちらも中間テーブルを用います。
IMG_8162 (1).jpg

ER図はこんな感じになりました。(手書きですいません・・・)

モデル

先ほどのER図は以下のようなアソシエーションとなりました。

group.rb
class Group < ApplicationRecord
  validates :name, presence: true, uniqueness: true
  
  has_many :group_users
  has_many :users, through: :group_users
  has_many :groupposts
  accepts_nested_attributes_for :group_users
end
group_user.rb
class GroupUser < ApplicationRecord
  
  belongs_to :group
  belongs_to :user
end
grouppost.rb
class Grouppost < ApplicationRecord
  belongs_to :group
  belongs_to :user
end

コントローラー

groups_controller.rb
class GroupsController < ApplicationController
  def new
    @group = Group.new
    @group.users << current_user
  end
  
  def create
    if Group.create(group_params)
      redirect_to groups_path, notice: 'グループを作成しました'
    else
      render :new
    end
  end
  
  def index
    @groups = Group.all.order(updated_at: :desc)
  end
  
  def show
    @group = Group.find_by(id: params[:id])
    
    if !@group.users.include?(current_user)
      @group.users << current_user
    end
    
    @groupposts = Grouppost.where(group_id: @group.id).all
  end
  
  private
  def group_params
    params.require(:group).permit(:name, :user_id [])
  end
  
  def grouppost_params
    params.require(:grouppost).permit(:content)
  end
  
end

基本的な設計はユーザー周りと同じです。

def show
.
.

  if !@group.users.include?(current_user)
   @group.users << current_user
  end
end

このようにグループのリンクを踏んだ人がそのグループに所属できるようにしています。

grouppost_controller.rb
class GrouppostsController < ApplicationController
  
  def new
    @grouppost = current_user.groupposts.new
    @group = Group.find_by(id: params[:group_id])
  end
  
  def create
    @group = Group.find_by(id: params[:group_id])
    @grouppost = current_user.groupposts.new(grouppost_params)
    @grouppost.group_id = params[:group_id]
    if @grouppost.save
      redirect_to group_path(@group.id)
    end
  end
  
  private
    def grouppost_params
      params.require(:grouppost).permit(:content)
    end
end

こちらも以前作成した投稿機能と同じ形にしています。

以上で2chちっくなグループ機能(掲示板風)が完成しました。
今後の課題としては、グループ作成時に鍵をかけることができ、招待制のグループを作ることができるようにしたいと考えています。

6
7
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
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?