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

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

Ruby on Rails 6.0によるWebアプリケーション開発22 エラー処理

<<前  [TOP]  次>>


例外が発生したときは例外を無視せずに2つの処理を行うことにします。
まずRailsの「logger」機能を使ってエラーが発生した事実を内部ログファイルに記録します。
次にカタログページを再表示して「無効なカートです」程度の短いメッセージを出力し、ユーザーがサイトを利用し続けられるようにします。
Railsにはエラー処理と通知に役立つ「フラッシュ」という便利な機能があります。
フラッシュはリクエストを処理する過程でオブジェクトを格納できます。
フラッシュに格納されたオブジェクトはそのセッションの次のリクエストの処理が終わるまで使うことができます。
その後は自動的に削除されます。
「C:\Rails6\work\shop\app\controllers」フォルダにある「carts_controller.rb」ファイルを下記のように変更します。
この変更により、無効なカートidが指定された場合には例外が補足されてその問題が通知されるようになります。
最初に「rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart」の記述を追加し、「invalid_cart()」メソッドをprivateの下に追加します。


【C:\Rails6\work\shop\app\controllers\carts_controller.rb】

class CartsController < ApplicationController
  before_action :set_cart, only: [:show, :edit, :update, :destroy]
  rescue_from ActiveRecord::RecordNotFound, with: :invalid_cart

  # GET /carts
  # GET /carts.json
  def index
    @carts = Cart.all
  end

  # GET /carts/1
  # GET /carts/1.json
  def show
  end

  # GET /carts/new
  def new
    @cart = Cart.new
  end

  # GET /carts/1/edit
  def edit
  end

  # POST /carts
  # POST /carts.json
  def create
    @cart = Cart.new(cart_params)

    respond_to do |format|
      if @cart.save
        format.html { redirect_to @cart, notice: 'カートを作成しました。' }
        format.json { render :show, status: :created, location: @cart }
      else
        format.html { render :new }
        format.json { render json: @cart.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /carts/1
  # PATCH/PUT /carts/1.json
  def update
    respond_to do |format|
      if @cart.update(cart_params)
        format.html { redirect_to @cart, notice: 'カートが更新されました。' }
        format.json { render :show, status: :ok, location: @cart }
      else
        format.html { render :edit }
        format.json { render json: @cart.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /carts/1
  # DELETE /carts/1.json
  def destroy
    @cart.destroy
    respond_to do |format|
      format.html { redirect_to carts_url, notice: 'カートは破棄されました。' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_cart
      @cart = Cart.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def cart_params
      params.fetch(:cart, {})
    end

	def invalid_cart
		logger.error "無効なカート(#{params[:id]})にアクセスしようとしました。"
		redirect_to market_index_url, notice: '無効なカートです。'
	end

end



ブラウザで「http://localhost:3000/carts/wibble」と無効なアドレスを入力します。
http://localhost:3000/」にリダイレクトされ、「無効なカートです。」とフラッシュメッセージが表示されます。

ブラウザの表示
ブラウザの表示


ログファイルは「C:\Rails6\work\shop\log」フォルダの「development.log」という名前で保存されています。


【C:\Rails6\work\shop\log\development.log】

Started GET "/carts/wibble" for ::1 at 2020-04-24 11:24:07 +0900
Processing by CartsController#show as HTML
  Parameters: {"id"=>"wibble"}
  [1m[36mCart Load (0.8ms)[0m  [1m[34mSELECT `carts`.* FROM `carts` WHERE `carts`.`id` = NULL LIMIT 1[0m
  ? app/controllers/carts_controller.rb:68:in `set_cart'
無効なカート(wibble)にアクセスしようとしました。
Redirected to http://localhost:3000/
Completed 302 Found in 12ms (ActiveRecord: 0.8ms | Allocations: 1185)



他の人のカートへのアクセスも禁止しなければなりません。
そのためには許可されたパラメーターのリストからcart_idを削除する記述をします。
その部分は「C:\Rails6\work\shop\app\controllers」フォルダにある「line_items_controller.rb」に記述していた「line_item_params()」メソッドです。
確認のために記載しますが変更する必要はありません。


【C:\Rails6\work\shop\app\controllers\line_items_controller.rb】

def line_item_params
      params.require(:line_item).permit(:good_id, :cart_id)
end



<<前  [TOP]  次>>