ステータスの紐付け(注文→ 製作)
ステータスの紐付けの復習。
実装してる時は、途中で脳死してしまいました。
単細胞な私は、
注文と、製作と両方のコントローラーに記述しないといけないのかなと
思いましたが...
"製作ステータスを手動で更新した時に、注文ステータスを変更されるようにしたい。"
"こっちがこれの時 = こっちはこれ。"とコントローラーに記述をすれば、いい。
注文側が"入金確認"のとき、製作側を"製作まち"
まずは、注文側が入金確認の時 = 製作側なので、
[orders_controllers]に記述していく。
:
def update
@order = Order.find(params[:id])
@order.update(order_status: params[:order][:order_status])
@order_detail = @order.order_details
redirect_to admin_order_path
if params[:order][:order_status] == "payment_confirmation"
@order_detail.update(making_status: 1)
end
end
private
def order_params
params.require(:order).permit(:order_status)
end
- 解説
@order = Order.find(params[:id])
params[:id]で指定されたIDに基づいて、データベースから特定のOrderを取得する
@order.update(order_status: params[:order][:order_status])
フォームから送信された params[:order][:order_status])の値で、注文ステータス(order_status)を更新する。
@order_detail = @order.order_details
注文 (Order)に関するすべての注文詳細(複数形)を取得し、@order_detailに格納。
if params[:order][:order_status] == "payment_confirmation"
@order_detail.update(making_status: 1)
end
注文ステータスが"payment_confirmation"(入金確認)の時、
製作ステータスがモデルに指定した、1:製作待ちになるように記述。
(製作ステータス側は、モデルに記述した、数字で記述すること。)
注文ステータス表示
<%= form_with model: @order, url:admin_order_path(@order), method: :patch do |f| %>
<%= f.select :order_status, [
[Order.order_statuses_i18n[:waiting_for_payment], :waiting_for_payment],
[Order.order_statuses_i18n[:payment_confirmation], :payment_confirmation],
[Order.order_statuses_i18n[:making], :making],
[Order.order_statuses_i18n[:shipping_in_process], :shipping_in_process],
[Order.order_statuses_i18n[:shipped], :shipped]
] %>
- 解説
<%= form_with model: @order, url: admin_order_path(@order), method: :patch do |f| %>
* form_with
ヘルパーを使って、注文(Order)のステータスを変更するためのフォーム作成をしている。(フォームを作成するためのメソッド)
* model: @order
でモデルに基づいてることを指定
* url: admin_order_path(@order), method: :patch
で、フォームの送信先を指定し、HTTPメソッドを記載する。
<%= f.select :order_status,[
[Order.order_statuses_i18n[:waiting_for_payment], :waiting_for_payment],
[Order.order_statuses_i18n[:payment_confirmation], :payment_confirmation],
[Order.order_statuses_i18n[:making], :making],
[Order.order_statuses_i18n[:shipping_in_process], :shipping_in_process],
[Order.order_statuses_i18n[:shipped], :shipped]
]
* f.select
はドロップダウンセレクトボックスを作成するヘルパーメソッド
* :order_status
セレクトボックスの対象を指定する。
* Order.order_statuses_i18n
注文ステータスの国際化された文字列も提供するためのメソッド。
お尻に[_i18n]つけると日本語化する。
Order.order_statuses_i18n[:waiting_for_payment], :waiting_for_payment]
表示されるテキストと値のペア。
Order.order_statuses_i18n[:waiting_for_payment]
表示用テキスト。
waiting_for_payment
値ってこと。
モデルとymlファイルの注文ステータスの記載はこう(enumは製作ステータスのため)
enum order_status: { waiting_for_payment: 0, payment_confirmation: 1, making: 2, shipping_in_process: 3, shipped: 4 }
#入金待ち:0, 入金確認:1, 製作中:2, 発送準備中:3, 発送済:4,
order:
order_status:
waiting_for_payment: "入金待ち"
payment_confirmation: "入金確認"
making: "製作中"
shipping_in_process: "発送準備中"
shipped: "発送済み"
参考にさせていただきました。
Discussion