🫥
before_actonについて
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