メソッド内の処理をまとめる
下記のようなRailsの記述。
@tweet = Tweet.find(params[:id])
が何度も出ていてなんとも Dry じゃない。
before_actionを使ってまとめられるのでまとめていく。
class TweetController < ApplicationController
def show
@tweet = Tweet.find(params[:id])
end
def edit
@tweet = Tweet.find(params[:id])
redirect_to root_path unless current_user.id == @tweet.user.id
end
def update
@tweet = Tweet.find(params[:id])
if @tweet.update(tweet_params)
redirect_to tweet_path(@tweet.id)
else
render :edit
end
end
def destroy
@tweet = Tweet.find(params[:id])
if current_user.id == @tweet.user.id
if @tweet.destroy
redirect_to root_path
else
render :show
end
else
redirect_to root_path
end
end
private
def tweet_params
params.require(:tweet).permit(:image, :name, :text, :detail, :price).merge(user_id: current_user.id)
end
end
@tweet = Tweet.find(params[:id]) をまとめていく。
まずは @tweet = Tweet.find(params[:id]) をメソッドとして定義する。
それを before_action で呼び込むと黄色い記述のようになる。
class TweetController < ApplicationController
before_action :set_tweet, only: [:show, :edit, :update, :destroy]
def show
end
def edit
redirect_to root_path unless current_user.id == @tweet.user.id
end
def update
if @tweet.update(tweet_params)
redirect_to tweet_path(@tweet.id)
else
render :edit
end
end
def destroy
if current_user.id == @tweet.user.id
if @tweet.destroy
redirect_to root_path
else
render :show
end
else
redirect_to root_path
end
end
private
def set_tweet
@tweet = Tweet.find(params[:id])
end
end
さらに青い記述の
redirect_to root_path unless current_user.id == @tweet.user.id
と
if current_user.id == @tweet.user.id
else
redirect_to root_path
end
は同じ内容なのでこれもまとめられる。
黄色の記述と同じように新たにメソッドを定義してbefore_actionを使うと…
class TweetController < ApplicationController
before_action :set_tweet, only: [:show, :edit, :update, :destroy]
before_action :correct_user?, only: [:edit, :destroy]
def show
end
def edit
end
def update
if @tweet.update(tweet_params)
redirect_to tweet_path(@tweet.id)
else
render :edit
end
end
def destroy
if @tweet.destroy
redirect_to root_path
else
render :show
end
end
private
def set_tweet
@tweet = Tweet.find(params[:id])
end
def correct_user?
redirect_to root_path unless current_user.id == @tweet.user.id
end
end
だいぶすっきりしたのではないだろうか。
というところで今日はここまで。
明日も頑張る。