🐒

ステータスの紐付け(注文→ 製作)

2024/06/25に公開

ステータスの紐付けの復習。
実装してる時は、途中で脳死してしまいました。

単細胞な私は、
注文と、製作と両方のコントローラーに記述しないといけないのかなと
思いましたが...

"製作ステータスを手動で更新した時に、注文ステータスを変更されるようにしたい。"
"こっちがこれの時 = こっちはこれ。"とコントローラーに記述をすれば、いい。

注文側が"入金確認"のとき、製作側を"製作まち"

まずは、注文側が入金確認の時 = 製作側なので、
[orders_controllers]に記述していく。

controllers/admin/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:製作待ちになるように記述。
(製作ステータス側は、モデルに記述した、数字で記述すること。)

注文ステータス表示

admin/views/show.html.erb
<%= 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は製作ステータスのため)

models/order.rb
enum order_status: { waiting_for_payment: 0, payment_confirmation: 1, making: 2, shipping_in_process: 3, shipped: 4 }
#入金待ち:0, 入金確認:1, 製作中:2, 発送準備中:3, 発送済:4,
config/locales/ja.yml
order:
 order_status:
        waiting_for_payment: "入金待ち"
        payment_confirmation: "入金確認"
        making: "製作中"
        shipping_in_process: "発送準備中"
        shipped: "発送済み"

https://zenn.dev/sudoukky/articles/6ff80772dffe44
参考にさせていただきました。

Discussion