【Rails】製作ステータスと注文ステータスの紐づけ
ECサイトの注文履歴詳細にある製作ステータスと注文ステータスの紐づけについて復習したいと思います。
完成目標
①製作ステータスを1つ「製作中」にしたときに、注文ステータスが「製作中」に更新される
②製作ステータスを全て「製作完了」にしたときに、注文ステータスが「発送準備中」に更新される
前提条件
- ルーティング実装済み
- ビュー作成済み
- enum実装済み
コントローラー記述
コントローラ内にif文とeach文を作成する
class Admin::OrderDetailsController < ApplicationController
def update
@order_detail = OrderDetail.find(params[:id])
@order_detail.update(making_status: params[:order_detail][:making_status])
order = @order_detail.order
if params[:order_detail][:making_status] == "in_making"
order.update(status:"making")
end
if is_all_order_details_making_completed(order)
order.update(status: 'shipping_in_process')
end
flash[:notice] = "更新に成功しました。"
redirect_to admin_order_path(@order_detail.order.id)
end
private
def order_detail_params
params.require(:order_detail).permit(:making_status)
end
def is_all_order_details_making_completed(order)
order.order_details.each do |order_detail|
if order_detail.making_status != 'making_completed'
return false
end
end
return true
end
end
上記コントローラ記述で@order_detail = OrderDetail.find(params[:id])
と@order_detail.update(making_status: params[:order_detail][:making_status])
、order = @order_detail.order
の3点を定義する。
製作ステータスを1つ「製作中」にしたときに、注文ステータスが「製作中」に更新される
if params[:order_detail][:making_status] == "in_making"
order.update(status:"making")
end
if params[:order_detail][:making_status] == "in_making"
上記の文で、前の画面で「製作中」が選択されたなら
を定義し、
order.update(status: 'shipping_in_process')
上記の文で対応するOrderの注文ステータスを「製作中」に更新するという意味になります。
byebugでparams内を確認するとorder_detail=>{"making_status"=>"waiting_for_making"}
という記述がみつかりました。こちらが前の画面から渡された情報になります。
この情報をparams[:order_detail][:making_status] == "in_making"
という形であらわすことができます。
製作ステータスを全て「製作完了」にしたときに、注文ステータスが「発送準備中」に更新される
if is_all_order_details_making_completed(order)
order.update(status: 'shipping_in_process')
end
if is_all_order_details_making_completed(order)
こちらの記述で製作ステータスを全て「製作完了」にしたときというのを表しますがこちらの表し方はストロングパラメータ内のeach文で抽出されます。
:
private
:
def is_all_order_details_making_completed(order)
order.order_details.each do |order_detail|
if order_detail.making_status != 'making_completed'
return false
end
end
return true
end
上記のeach文を解説すると上からorder.order_details.each do |order_detail|
の記述で
order_detailひとつひとつのmaking_statusを判定し、if order_detail.making_status != 'making_completed'
で一つでもmaking_statusがmaking_completedでなければ、return false
となり、ここで処理が終了になります。
上記の記述で全てが製作完了になるまで処理が続けられ、全てのorder_detailのmaking_statusがmaking_conmpletedになった際に下のreturn true
で返されます。
そして、updateアクションに戻りorder.update(status: 'shipping_in_process')
で注文ステータスが「発送準備中」に更新される仕組みとなります。
each文の中にif文が入ったりと少し複雑ではありますが以上が製作ステータスと注文ステータスの紐づけになります。
今回はチームメイトの助けもありできましたが、来月以降も考慮し1人でもeach文とif文を定義できるように頑張ります!
いや~、難しい!笑
Discussion