前提条件
ECサイトで注文情報入力 ==> 注文確認画面の間に注文情報入力でバリデーションをかけたい
1.よく使うバリデーション
validates :title, presence: true
などの普段よく使うバリデーションは
booksテーブルにtitleというカラムがあり
データベースに保存される時、つまり @book.save(book_params)の時にtitleカラムが空白だとバリデーションがかかる。
しかし、ECサイトで注文情報入力 ==> 注文確認画面
==> 注文確定(ここで.save
が行われる)というフローで実装する際、注文情報入力 ==> 注文確認画面の間に.save
が発生しない為、モデルにかけるバリデーションをrenderで呼び出すことができない為if文で条件分岐を書いてflash[:notice]
を使う必要がある。
2.if文の実装
when 3
if params[:order][:new_add][:postal_code] == "" && params[:order][:new_add][:address] == "" && params[:order][:new_add][:name] == ""
flash[:notice] = "新しいお届け先が全て入力されていません"
redirect_to new_order_path
elsif params[:order][:new_add][:postal_code] == ""
flash[:notice] = "郵便番号が入力されていません"
redirect_to new_order_path
elsif params[:order][:new_add][:address] == ""
flash[:notice] = "住所が入力されていません"
redirect_to new_order_path
elsif params[:order][:new_add][:name] == ""
flash[:notice] = "宛名が入力されていません"
redirect_to new_order_path
else
@order.postal_code = params[:order][:new_add][:postal_code]
@order.address = params[:order][:new_add][:address]
@order.name = params[:order][:new_add][:name]
end
end
3.コードの説明
まず、case文を使い、ラジオボタンを3個order/new.html.erbに書きwhenで3パターン分岐させている。
そして、3個目のラジオボタンを選ぶと注文情報入力時に新しいお届け先を入力できるように実装している。
[:new_add] は注文情報入力時に新しいお届け先を入力する際のパラメータ。
params[:フォームで送られてくる値] == ""
flash[:notice] = ”ホニャホニャ"
と書くことで空欄の時にフラッシュメッセージを出せる。
4.今回の実装を終えて
当初 == nil にしており値が返ってきていなかったがターミナルを見ると""になっていたので条件文を変えるとうまくいった。
&&で条件文を繋ぐ時に最後に一個だけイコールを入れるのではなく毎回イコールが必要である。
5.リファクタリング
if文をelsifで繋いで条件文を書きまくるのはあまり良くないらしいので他にいい方法があれば教えてください。