はじめに
bootstrap導入済
namespases使用
devaice導入済
ordersモデル 実装済
admin/orders_controller 作成済
注文機能作成済
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導入
gimfailにenum導入して日本語で表記されるようにする
gem 'rails-i18n'
gem 'enum_help'
bundale install
注文ステータスの日本語表示については、ja.yml に以下のように設定を追加します。
ja:
enums:
order:
order_status:
waiting_for_payment: "入金待ち"
payment_confirmed: "入金確認"
in_production: "製作中"
preparing_to_ship: "発送準備中"
shipped: "発送済み"
ルーティング
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
モデル
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
コントローラー
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の注文ステータスを更新するという単純な役割を果たしています。もし更新が成功すれば、成功メッセージが表示され、更新が失敗すれば、失敗メッセージが表示されます。どちらの場合も、更新後は注文一覧ページにリダイレクトします。
ビューページ
<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から取得します。
完成イメージ(顧客側)
今回は、顧客の注文一覧ページに表示しました。
<%= I18n.t("enums.order.order_status.#{order.order_status}") %>
ビュー内で order.order_status を日本語で表示する場合は、I18n.t を使用して変換できます: