🫥

before_actonについて

2024/02/06に公開

before_actionとは

before_actionはRailsのコントローラに用意されたフィルタの1つで、アクションを実行する前に特定の処理を実行させることができる

フィルターでコードをリファクタリングする

下記コントローラのコードを見るとboard = Board.find(params[:id])が重複しているのがわかる。そこでbofore_actionを使用してリファクタリングをすることができる。
修正前

boards_controller.rb
class BoardsController < ApplicationController
  def index
    @boards = Board.all
    #binding.pry
  end

  def new
    @board = Board.new
    #binding.pry
  end

  def create
    board = Board.create(board_params)
    redirect_to board
    #binding.pry
  end

  def show
    @board = Board.find(params[:id])
    #binding.pry
  end

  def edit
    @board = Board.find(params[:id])
  end

  def destroy
    board = Board.find(params[:id])
    #binding.pry
    board.destroy

    redirect_to boards_path

  end

  def update
    board = Board.find(params[:id])
    board.update(board_params)

    redirect_to board
  end

  private

  def board_params
    params.require(:board).permit(:author_name, :title, :body)
  end

  def set_target_board
    @board = Board.find(params[:id])
  end
end

修正後

boards_controller.rb
class BoardsController < ApplicationController
  before_action :set_target_board, only: %i[show edit update destroy]
  def index
    @boards = Board.all
    #binding.pry
  end

  def new
    @board = Board.new
    #binding.pry
  end

  def create
    board = Board.create(board_params)
    redirect_to board
    #binding.pry
  end

  def show
  end

  def edit
  end

  def destroy
    @board.destroy
    redirect_to boards_path
  end

  def update
    @board.update(board_params)

    redirect_to board
  end

  private

  def board_params
    params.require(:board).permit(:author_name, :title, :body)
  end

  def set_target_board
    @board = Board.find(params[:id])
  end
end

set_target_boardアクションで重複している@board = Board.find(params[:id])をアクション化し、before_action :set_target_board, only: %i[show edit update destroy]を最初に定義することによってonlyオプションのshow,edit,update,destroyのアクション前にset_target_boardアクションを実行する。

その他のフィルター

after_action
アクションを実行後に指定したコールバックを実行する

around_action
アクション実行中に指定したコールバックを実行する

Discussion