Railsでグループ機能(掲示板風)の作成
<開発環境>
- ruby 2.6.3
- Rails 5.1.6
- AWS Cloud9
- GitHub
- sqlite3(develop環境)
設計構想
ユーザーは自由にグループを作成でき、また他のユーザーが作成したグループに所属することもできます。
また、グループに参加したメンバーはグループ内で自由に発言することも可能になります。
この仕組みをテーブルに落とし込むと、
ユーザーとグループは多対多の関係になるので中間テーブルを用いることとします。
そして、ユーザーとグループ内での投稿も多対多の関係となる為、こちらも中間テーブルを用います。
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ちっくなグループ機能(掲示板風)が完成しました。
今後の課題としては、グループ作成時に鍵をかけることができ、招待制のグループを作ることができるようにしたいと考えています。