0
0

More than 1 year has passed since last update.

注文ステータス enum日本語での実装

Last updated at Posted at 2023-07-24

:cherry_blossom: はじめに
bootstrap導入済 
namespases使用
devaice導入済
ordersモデル 実装済
admin/orders_controller 作成済
注文機能作成済
public/orders_controller.rb 作成済

public/orders_controller.rb
 def create
    @order = Order.new(order_params)
    @order.customer_id = current_customer.id
    @order.order_status = 0
    @order.save

    current_customer.cart_items.each do |cart_item|
      @order_datail = OrderDatail.new
      @order_datail.order_id = @order.id
      @order_datail.item_id = cart_item.item_id
      @order_datail.quantity = cart_item.quantity
      @order_datail.buy_price = cart_item.subtotal
      @order_datail.production_status = 0
      @order_datail.save
    end
    
    flash[:notice] = "ご注文が確定しました。"
    current_customer.cart_items.destroy_all
    redirect_to complete_orders_path
    
  end

enum導入

:star:gimfailにenum導入して日本語で表記されるようにする

gem 'rails-i18n'
gem 'enum_help'
bundale install

:star:注文ステータスの日本語表示については、ja.yml に以下のように設定を追加します。

config/locales.ja.yml
ja:
  enums:
    order:
       order_status:
        waiting_for_payment: "入金待ち"
        payment_confirmed: "入金確認"
        in_production: "製作中"
        preparing_to_ship: "発送準備中"
        shipped: "発送済み"

:shamrock:ルーティング

admin ネームスペースの中に orders リソースを定義する。
resources :orders の中に、update_status のためのルーティングを追加する。

namespace :admin do
resources :orders, only: [:show, :update, :index, :index] do
+    member do
+     patch :update_status
+    end
  end
end

:shamrock:モデル

order.rb
class Order < ApplicationRecord
enum order_status: { waiting_for_payment: 0, payment_confirmed: 1, in_production: 2, preparing_to_ship: 3, shipped: 4 }

def self.order_statuses_i18n
        order_statuses.keys.map do |status|
          [I18n.t("enums.order.order_status.#{status}"), status]
        end.to_h
    end

:shamrock:コントローラー

admin/orders_controller.rb
class Admin::OrdersController < ApplicationController
   before_action :authenticate_admin!
   
  def index
      @orders = Order.all
  end
  
  def update_status
    @order = Order.find(params[:id])
    if @order.update(order_params)
      flash[:notice] = "注文ステータスを更新しました"
      redirect_to admin_orders_path
    else
      flash[:alert] = "注文ステータスの更新に失敗しました"
      redirect_to admin_orders_path
    end
  end

  private

  def order_params
   params.require(:order).permit(:order_status)
  end
end

update_statusメソッド: このメソッドは、注文ステータスを更新するためのアクションを定義しています。指定されたidパラメータを用いて、更新すべきOrderオブジェクトをデータベースから取得します。

if @order.update(order_params): この行は、取得した@orderオブジェクトの更新を試みます。更新に用いるパラメータはorder_paramsメソッドから取得します。更新が成功すれば、ifブロックが実行され、flashメッセージに"注文ステータスを更新しました"が設定され、その後admin_orders_pathにリダイレクトします。

else: この部分は、@orderオブジェクトの更新が何らかの理由で失敗した場合に実行されます。この場合、flashメッセージに"注文ステータスの更新に失敗しました"が設定され、その後admin_orders_pathにリダイレクトします。

order_paramsメソッド: このプライベートメソッドは、更新に必要なパラメータを指定します。この場合、:order_statusのみを許可しており、それ以外のパラメータは無視されます。

全体として、このコントローラーのアクションは、指定されたidの注文ステータスを更新するという単純な役割を果たしています。もし更新が成功すれば、成功メッセージが表示され、更新が失敗すれば、失敗メッセージが表示されます。どちらの場合も、更新後は注文一覧ページにリダイレクトします。

ビューページ

:cherry_blossom:完成イメージ(管理者側)
スクリーンショット 2023-07-24 20.32.17.png

admin/orders/index.html.erb
   <td>
     <%= form_with model: order, url: update_status_admin_order_path(order), method: :patch do |f| %>
     <%= f.select :order_status, Order.order_statuses_i18n, class: "form-control" %>
     <%= f.submit "更新", class: "btn btn-primary" %>
     <% end %>
    </td>

<%= form_with model: order, url: update_status_admin_order_path(order), method: :patch do |f| %>
この行でform_withメソッドを使用してフォームを作成しています。フォームには次の属性があります:

model: order: この属性はフォームが操作するオブジェクトを指定します。ここではorderオブジェクトを操作します。

url: update_status_admin_order_path(order): この属性はフォームの送信先URLを指定します。update_status_admin_order_path(order) はupdate_statusアクションを持つadmin_orderコントローラのパスヘルパーで、orderを引数に取ります。

method: :patch: これはHTTPメソッドを指定します。ここでは:patchを使用しています。

<%= f.select :order_status, Order.order_statuses_i18n, class: "form-control" %>: この行は、order_status属性のための選択メニュー(ドロップダウンメニュー)を生成します。選択肢はOrder.order_statuses_i18nから取得します。


:star:完成イメージ(顧客側)
今回は、顧客の注文一覧ページに表示しました。
スクリーンショット 2023-07-24 20.43.22.png

 <%= I18n.t("enums.order.order_status.#{order.order_status}") %>

ビュー内で order.order_status を日本語で表示する場合は、I18n.t を使用して変換できます:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0