before_actionとは?
before_actionとは、Railsのコントローラーで使用できるリファクタリングの一種です。
before_actionを使用すると、
コントローラで定義されたアクションが実行される前に、共通の処理を行うことができます。
具体的な使用方法
以下のような中身のコントローラーについて見ていきます。
class TweetsController < ApplicationController
def index
@tweets = Tweet.all
end
def new
@tweet = Tweet.new
end
def create
Tweet.create(tweet_params)
end
def destroy
tweet = Tweet.find(params[:id])
tweet.destroy
end
def edit
@tweet = Tweet.find(params[:id])
end
def update
tweet = Tweet.find(params[:id])
tweet.update(tweet_params)
end
def show
@tweet = Tweet.find(params[:id])
end
private
def tweet_params
params.require(:tweet).permit(:distance, :image)
end
end
よく見ると、Railsの7つのアクションの内、
editとshowアクションの中身が、
@tweet = Tweet.find(params[:id])
が繰り返し使用されています。
このようなコードをリファクタリングし可読性を高めるために、
以下のように、before_actionを使用します。
class TweetsController < ApplicationController
before_action :set_tweet, only: [:edit, :show]
def index
@tweets = Tweet.all
end
def new
@tweet = Tweet.new
end
def create
Tweet.create(tweet_params)
end
def destroy
tweet = Tweet.find(params[:id])
tweet.destroy
end
def edit
end
def update
tweet = Tweet.find(params[:id])
tweet.update(tweet_params)
end
def show
end
private
def tweet_params
params.require(:tweet).permit(:name, :image, :text)
end
def set_tweet
@tweet = Tweet.find(params[:id])
end
end
このように、
before_actionを利用して、edit、showの2つのアクションの前に実行される、
set_tweet(メソッド名は自分で決める)というメソッドを新たに定義し、
先ほど繰り返し使用していた
@tweet = Tweet.find(params[:id])
をまとめる事が可能になります。
#まとめ
before_actionを使用する事で、
コードが冗長になることを防ぎ、コードの可読性を上げる事ができます!
今回例として挙げたコードは、
edit、showの2つのアクションの中身が一緒でしたが、
繰り返し使用するコードが多ければ大きいほど効果がデカくなります!
Railsのリファクタリングとして、
参考にしてみてください!