【Ruby on rails】グループ作成　その３　グループの編集と削除

# はじめに
プログラミングを勉強して2か月ほどです。
初心者なので間違っているところがあれば、ご指摘いただけると幸いです。
※@ki_87(kei i)さんの記事を参考に作成しました。
　とても分かりやすく参考になりました。
　ありがとうございます。

# グループの編集と削除
今回は作成したグループの編集と削除を実装していきます。
グループの作成については下記の記事で行っています。

https://qiita.com/kenty1116/items/2807833bc375ead197af

グループへの参加と退出は下記の記事で行っています。

https://qiita.com/kenty1116/items/f356eb9802aef9bbbb0c

それでは作成していきましょう！！！

# Let's start!!!
## ルーティングの設定
```routes.rb
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`を使用するからです。

## コントローラーの設定
```groups.controller.rb
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アクション補足

グループの編集は、グループ作成者のみができたほうがセキュリティ面を考えると良さそうです。
グループの編集権限を付与しましょう。
```groups.controller.rb
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アクション補足

グループの削除についてもグループ作成者のみができたほうがセキュリティ面を考えると良さそうですね。
グループの削除権限を付与しましょう。

```groups.controller.rb
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`が呼び出されます。

# 終わりに
みなさん実装お疲れ様でした！！！
グループの編集と削除が実装出来たかと思います。
分かりづらい点が多かったと思いましたが、最後まで読んでいただきありがとうございました！！