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?

Railsでモデルのバリデーションを回避するためのhidden_fieldの使い方

Last updated at Posted at 2024-10-08

はじめに

ユーザー登録画面を作成する際、presence: trueバリデーションを設定しているフィールドがフォームに含まれていない場合、バリデーションエラーが発生します。今回は、モデルを変更したくないけど、登録機能だけは完成させるためにバリデーションエラーを回避するために、hidden_fieldを使う方法を紹介します。

問題

以下のように、presence: trueのバリデーションが設定されたモデルを使っているとします。

class User < ApplicationRecord
  validates :username, :email, :password, :phone_number, :address, :gender, presence: true, on: :create
  validates :email, length: { maximum: 255 }, format: EMAIL_FORMAT, uniqueness: { case_sensitive: false }, allow_blank: true
  validates :password, length: { within: 6..128 }, allow_blank: true
  validates :username, length: { maximum: 100 }
  validates :phone_number, length: { maximum: 15 }
  validates :address, length: { maximum: 255 }
  validates :gender, inclusion: { in: %w[male female other] }
end

このバリデーションでは、username(ユーザー名)、email(メールアドレス)、password(パスワード)、phone_number(電話番号)、address(住所)、およびgender(性別)が必須となっています。しかし、性別をフォームに含めずに登録したい場合、バリデーションエラーが発生します。

解決方法:hidden_fieldを使ってバリデーションを回避する

hidden_fieldを使って、性別(gender)にデフォルト値を設定することで、バリデーションエラーを回避します。

実装例

以下のように、フォームにhidden_fieldを追加してgenderにデフォルト値(例えば 'other')を渡します。

= form_with model: @user do |form|
  = form.label :username
  = form.text_field :username

  = form.label :email
  = form.email_field :email

  = form.label :password
  = form.password_field :password

  = form.label :phone_number
  = form.telephone_field :phone_number

  = form.label :address
  = form.text_field :address

  // hidden_fieldを利用して性別フィールドにデフォルト値を渡す
  = form.hidden_field :gender, value: 'N/A'

  = form.submit '登録'

注意点

もしフォームにその項目が本当に必要ない場合は、モデルのバリデーション自体を見直すのが良いですが、特定の条件下でそのフィールドを無視したい場合には、hidden_fieldで回避する方法が便利です。

まとめ

hidden_fieldを使って、フォームに存在しないフィールドにデフォルト値を設定することで、バリデーションエラーを回避することができます。この方法は、フォームの見た目をシンプルにしながら、バリデーションを適切にパスするための有効な手段です。

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?