プログラミング勉強中!!

TECH::EXPERT 40期 受講生の筆者がその日学んだことをアウトプットしていくブログです。学習量によっては全て書ききれないこともあります。お気付きのことありましたバシバシコメントください!!3月中旬よりWEBエンジニアとして働くことになりました。日々の業務などについても発信させていただきたいと思います!!よろしくお願いいたします!!

共通の処理をまとめる(コントローラー編)

はい、こんばんは。

コントローラでの共通の処理のまとめ方をアウトプットします!!

Tasks_controller.rb

def show
 @task = current_user.tasks.find(params[:id])
end

def edit
 @task.update!(task_params)
end

def update
 @task = current_user.tasks.find(params[:id])
 @task.update!(task_params)
end

def destroy
 @task.update!(task_params)
 @task.destroy
end
 
private

def task_params
  params.require(:task).permit(:name, :description)
end

こんな記述があったとします。

共通している処理は

@task = current_user.tasks.find(params[:id])

ですね。

これはRails の DRYの原則(全ての記述は単一且つ明確でなければならない)に基づき、まとめてやる必要があります。

手順は以下の通りです。

①共通の処理をまとめてprivate以下に定義する。

Tasks_controller.rb

private

def task_params
 params.require(:task).permit(:name, :description)
end

def set_task
 @task = current_user.tasks.find(params[:id])  #共通の処理をまとめた。
end

②before_actionを利用して、set_taskメソッドを各アクションの実行前に呼び出す

Tasks_controller.rb

class TasksController < ApplicationController
before_action :set_task, only: [:show, :edit, :update, :destroy] 
#only: []に対して:set_taskを適用するということ
・
・
・
end

③各アクションで定義していた共通の処理を消す

Tasks_controller.rb

class TasksController < ApplicationController
before_action :set_task, only: [:show, :edit, :update, :destroy] 
#only: []に対して:set_taskを適用するということ

def show
end

def edit
 @task.update!(task_params)
end

def update
 @task.update!(task_params)
end

def destroy
 @task.update!(task_params)
 @task.destroy
end
 
private

def task_params
  params.require(:task).permit(:name, :description)
end

def set_task
 @task = current_user.tasks.find(params[:id])  #共通の処理をまとめた。
end

これで共通の処理をまとめることができました。

実際にアプリを動かしてみると、うまくいくはずです。

それでは。