1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails 注文確認画面でリロードした際のエラー回避

Posted at

はじめに

  • RailsでECサイトにあるような注文フォームを作成
  • 注文確認画面と、注文確定画面でリロードをするとエラーになる
  • コントローラーに記述することでエラーを回避する

前提条件

  • Orderモデルがある(name,email,telephone,addressカラム)

回避したエラー例

スクリーンショット 2023-07-06 17.50.52.png

エラーを見ると、order_paramsメソッド内でパラメータが欠落しているか空であるということがわかる。

ordersコントローラーの記述

corders_controllers.rb
# 省略

def confirm
    # パラメーターがあるか確認
    if params[:order].present?
      @order = Order.new(order_params)
    else
      # ユーザーがリロードした時
      return redirect_to new_order_path
    end
end

# 省略

def complete
    @order = Order.find_by(id: session[:order_id])
    
    # ユーザーがリロードした時
    return redirect_to new_order_path if @order.blank?
    
    # sessionの注文情報を削除
    session[:order_id] = nil
end

private

def order_params
    params.require(:order)
          .permit(:name,
                  :email,
                  :telephone,
                  :delivery_address)
end

エラー対策

まず、注文確認画面では、注文フォームから送られてきたパラメーターが存在するかどうかを確認。もし、ユーザーがリロードした場合は、空になるため、再度入力フォーム画面へリダイレクトするようにする。

def confirm
    # パラメーターがあるか確認
    if params[:order].present?
      @order = Order.new(order_params)
    else
      # ユーザーがリロードした時
      return redirect_to new_order_path
    end
end

次に、注文確定画面でも同じ対策を。ここでは、注文を確定する際(createアクションで)に、sessionメソッドによって、キーと値のペアでデータを保存している。そのため、ユーザーがリロードすると、@orderが空になるため、「if @order.blank?」なら入力フォーム画面へリダイレクトするようにする。

def complete
    @order = Order.find_by(id: session[:order_id])
    
    # ユーザーがリロードした時
    return redirect_to new_order_path if @order.blank?
    
    # sessionの注文情報を削除
    session[:order_id] = nil
end

まとめ

  • 「入力→確認→確定」のような処理では、リロードするとエラーになることがある
  • パラメーターがあるかどうかで条件分岐をすることで、エラーを回避できる

他にもっといい方法がないか、学習していきます!
⚠️学習4ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?