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

(独習Ruby on Rails)フォームオブジェクトを利用したバリデーション

Last updated at Posted at 2022-03-16

概要

ある程度勉強を進めていたけれど、あまりにも基礎が不足しているので書籍「独習Ruby on Rails」をやり始めたのだけれど、フォームバリデーションのところでサンプルコードどおりに入力しても全然動かなかったのでその対応をメモとして残す。

環境

・Rails 7.0.2.2
・ruby 3.0.0
・macOS Monterey 12.2.1

フォームオブジェクトによるバリデーション

例題概要

  • 書籍の例題としてはフォームオブジェクトを利用したバリデーションで利用規約のチェック機能を実現するというもの。
  • チェックボックスではなくテキストフィールドに'yes'と入力した場合に正常形として画面遷移し、それ以外はエラーを表示するというもの。

(サンプルイメージ)

スクリーンショット 2022-03-17 0.08.44.png

・ここでyes以外を入力またはブランクで「承認」を押下

スクリーンショット 2022-03-17 0.11.51.png

この「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さん、また講座買います!!(いつとは言っていない)

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