はじめに
- RailsでECサイトにあるような注文フォームを作成
- 注文確認画面と、注文確定画面でリロードをするとエラーになる
- コントローラーに記述することでエラーを回避する
前提条件
- Orderモデルがある(name,email,telephone,addressカラム)
回避したエラー例
エラーを見ると、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ヶ月目の初学者による投稿です。
⚠️間違いがあるかもしれません。ご容赦ください。
⚠️ご指導、ご教授いただけると幸いです。