メソッド内の処理をまとめる

下記のような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

 

 だいぶすっきりしたのではないだろうか。

というところで今日はここまで。

 

明日も頑張る。