<<前 [TOP] 次>>
まずはテーブルリレーションの定義をします。
line_itemモデルにline_itemからorderへのリレーションを追加します。
【app/models/line_item.rb】
class LineItem < ActiveRecord::Base belongs_to :order belongs_to :good belongs_to :cart def total_price good.price * quantity end end
「belongs_to :order」の記述を追加しました。
orderからline_itemへのリレーションも行います。
注文を削除するときにはその注文に関連付けされたline_itemもすべて削除するように「has_many」で指定します。
【app/models/order.rb】
class Order < ActiveRecord::Base has_many :line_items, dependent: :destroy end
ordersコントローラの「create()」メソッドを編集します。
【app/controllers/orders_controller.rb】
class OrdersController < ApplicationController before_action :set_order, only: [:show, :edit, :update, :destroy] # GET /orders # GET /orders.json def index @orders = Order.all end # GET /orders/1 # GET /orders/1.json def show end # GET /orders/new def new @cart = current_cart if @cart.line_items.empty? redirect_to market_url, notice: 'カートは空です。' return end @order = Order.new respond_to do |format| format.html format.json { render json: @order } end end # GET /orders/1/edit def edit end # POST /orders # POST /orders.json def create @order = Order.new(order_params) @order.add_items(current_cart) respond_to do |format| if @order.save Cart.destroy(session[:cart_id]) session[:cart_id] = nil format.html { redirect_to market_url, notice: 'ご注文ありがとうございました。' } format.json { render json: @order, status: :created, location: @order } else format.html { render :new } format.json { render json: @order.errors, status: :unprocessable_entity } end end end # PATCH/PUT /orders/1 # PATCH/PUT /orders/1.json def update respond_to do |format| if @order.update(order_params) format.html { redirect_to @order, notice: 'Order was successfully updated.' } format.json { render :show, status: :ok, location: @order } else format.html { render :edit } format.json { render json: @order.errors, status: :unprocessable_entity } end end end # DELETE /orders/1 # DELETE /orders/1.json def destroy @order.destroy respond_to do |format| format.html { redirect_to orders_url, notice: 'Order was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_order @order = Order.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def order_params params.require(:order).permit(:name, :address, :email, :tel_number, :pay_type) end end
create()メソッドのみ実装しています。
def create @order = Order.new(order_params) @order.add_items(current_cart) respond_to do |format| if @order.save Cart.destroy(session[:cart_id]) session[:cart_id] = nil format.html { redirect_to market_url, notice: 'ご注文ありがとうございました。' } format.json { render json: @order, status: :created, location: @order } else format.html { render :new } format.json { render json: @order.errors, status: :unprocessable_entity } end end end
最初の部分「@order = Order.new(order_params)」で新しいorderオブジェクトの作成と初期化を行っています。
「order_params()」メソッドは一番最後に記述されています。
「params.require(:order).permit(:name, :address, :email, :tel_number, :pay_type)」の記述が初期化を行っています。これは「params[:order]」と同じ意味になります。
「add_items()」メソッドはこの後orderモデルに実装します。
ではorderモデルに「add_items()」メソッドを実装します。
【app/models/order.rb】
class Order < ActiveRecord::Base has_many :line_items, dependent: :destroy def add_items(cart) cart.line_items.each do |item| item.cart_id = nil line_items << item end end end
cart_idをnilに設定する処理は、カートを削除する時にline_itemが連動して削除されるのを防ぎます。
↓↓クリックして頂けると励みになります。