はじめに
プログラミングを勉強して2か月ほどです。
初心者なので間違っているところがあれば、ご指摘いただけると幸いです。
※@ki_87(kei i)さんの記事を参考に作成しました。
とても分かりやすく参考になりました。
ありがとうございます。
グループの編集と削除
今回は作成したグループの編集と削除を実装していきます。
グループの作成については下記の記事で行っています。
グループへの参加と退出は下記の記事で行っています。
それでは作成していきましょう!!!
Let's start!!!
ルーティングの設定
Rails.application.routes.draw do
devise_for :users
root to: "groups#index"
resources :groups do
get "join" => "groups#join"
delete "exit" => "groups#exit"
end
end
ルーティングに関しては前回のグループへの参加と退出の時と変わりません。
railsの7つのアクションであるedit
とdestroy
を使用するからです。
コントローラーの設定
class GroupsController < ApplicationController
before_action :set_group, only: [:show, :edit, :update, :destroy]
before_action :login_restrictions, only: :edit
def index
@groups = Group.all
end
def new
@group = Group.new
end
def create
@group = Group.new(group_params)
@group.owner_id = current_user.id
if @group.save
redirect_to root_path
else
render :new, status: :unprocessable_entity
end
end
def show
end
def join
@group = Group.find(params[:group_id])
unless @group.users.include?(current_user)
@group.users << current_user
end
end
def edit
end
def update
if @group.update(group_params)
redirect_to group_path(@group)
else
render :edit, status: :unprocessable_entity
end
end
def exit
@group = Group.find(params[:group_id])
@group.users.delete(current_user)
redirect_to root_path
end
def destroy
if current_user.id == @group.owner_id
@group.destroy
redirect_to root_path
else
redirect_to root_path
end
end
private
def group_params
params.require(:group).permit(:group_name, :introduction, :group_image).merge(user_id: current_user.id)
end
def set_group
@group = Group.find(params[:id])
end
def login_restrictions
return unless current_user.id != @group.owner_id
redirect_to root_path
end
end
editアクション補足
グループの編集は、グループ作成者のみができたほうがセキュリティ面を考えると良さそうです。
グループの編集権限を付与しましょう。
def login_restrictions
return unless current_user.id != @group.owner_id
redirect_to root_path
end
上記の記述によりcurrent_user.id
が@group.owner_id
と一致していなければ、トップページに戻すように設定しています。(つまり編集ページはいけない)
そしてbefore_action :login_restrictions, only: :edit
の記述でedit
アクションが呼び出される前に実行します。
destroyアクション補足
グループの削除についてもグループ作成者のみができたほうがセキュリティ面を考えると良さそうですね。
グループの削除権限を付与しましょう。
def destroy
if current_user.id == @group.owner_id
@group.destroy
redirect_to root_path
else
redirect_to root_path
end
end
destroy
アクションもedit
アクションと同様にcurrent_user.id
が@group.owner_id
一致していれば、@group.destroy
destroyアクションが実行されるように設定します。
Rails7での注意点
削除ボタンを実装する際に注意点が必要です。
<%=link_to 'Delete', group_path(@group.id), data: { turbo_method: :delete }, class:"btn btn-purple mx-auto d-block w-50" %>
上記の記述の中でdata: { turbo_method: :delete }
がポイントになります。
Rails7より前のバージョンではmethod: :delete
という記述でdestoroyアクションが実行されたようですが記述方法が変わっているので注意です!
data: { turbo_method: :delete }とは
そもそも、なぜdestroy
アクションが実行されるときにdata: { turbo_method: :delete }
という記述が必要なのか?
この記述をしないと、httpメソッドのget
が呼び出されてしまうからのようです。data: { turbo_method: :delete }
と記述することでdelete
が呼び出されます。
終わりに
みなさん実装お疲れ様でした!!!
グループの編集と削除が実装出来たかと思います。
分かりづらい点が多かったと思いましたが、最後まで読んでいただきありがとうございました!!