学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Ruby on RailsでWebアプリケーション開発その26 注文確定ボタンの実装

<<前  [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が連動して削除されるのを防ぎます。


f:id:MrRadiology:20180301215952p:plain


<<前  [TOP]  次>>