概要
ある程度勉強を進めていたけれど、あまりにも基礎が不足しているので書籍「独習Ruby on Rails」をやり始めたのだけれど、フォームバリデーションのところでサンプルコードどおりに入力しても全然動かなかったのでその対応をメモとして残す。
環境
・Rails 7.0.2.2
・ruby 3.0.0
・macOS Monterey 12.2.1
フォームオブジェクトによるバリデーション
例題概要
- 書籍の例題としてはフォームオブジェクトを利用したバリデーションで利用規約のチェック機能を実現するというもの。
- チェックボックスではなくテキストフィールドに'yes'と入力した場合に正常形として画面遷移し、それ以外はエラーを表示するというもの。
(サンプルイメージ)
・ここでyes以外を入力またはブランクで「承認」を押下
この「Accepting must be accepted」のメッセージを表示するのに手こずった。
原因
バリデーションでエラーと判定されているが、renderでViewにオブジェクトが渡された際にエラーが0件の状態で渡されていたため。
以下のとおりrender処理時の引数「status」に適当なエラーデータを渡すことでバリデーションの結果をViewに表示できるようになった。
class AcceptancesController < ApplicationController
def new
@acceptance = Acceptance.new
end
def create
@acceptance = Acceptance.new(acceptance_params)
if @acceptance.valid?
puts '承諾されました!!'
redirect_to books_path
else
# ここで「status:」としてエラーであるという情報を渡さないといけない。
# (statusを明示的に渡さないと処理が200OKのステータスになってしまう)
render :new, status: :unprocessable_entity
end
end
private
def acceptance_params
params.require(:acceptance).permit(:accepting)
end
end
最後に
書籍の方はRails5が前提なので、Rals7との仕様差異なのかもしれないけど全然情報がなくてなかなか答えに辿りけなかった。
Udemyの講座がRails7に対応してくれていたので助かった...
まだ途中までしかやってないけどわかりやすくておすすめです。
https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/
Udemyさん、また講座買います!!(いつとは言っていない)