0
0

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 1 year has passed since last update.

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

Last updated at Posted at 2023-10-06

はじめに

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

グループの編集と削除

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

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

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

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つのアクションであるeditdestroyを使用するからです。

コントローラーの設定

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.destroydestroyアクションが実行されるように設定します。

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が呼び出されます。

終わりに

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

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?