はじめに
ユーザー登録画面を作成する際、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を使って、フォームに存在しないフィールドにデフォルト値を設定することで、バリデーションエラーを回避することができます。この方法は、フォームの見た目をシンプルにしながら、バリデーションを適切にパスするための有効な手段です。