Rails Tutorial 6.2章ではModelに対してValidationを設定する方法をまとめておきます。
よくあるバリデーションの設定方法
よくあるバリデーションは大体決まっています。主なものは下記です。
- 必須チェック
- validates( :name, presence:true )
- 長さチェック
- validates( :name, length:{maximum:50} )
- 一意チェック
- validates( :email, uniqueness:{ case_sensitive:false } )
- フォーマットチェック
- VALID_EMAIL_REGEX = /\A[\w+-_]+@[a-z\d-.]+.[a-z]+\z/i
- validates( :email, format:{with: VALID_EMAIL_REGEX } )
- 数値チェック
- validates(:points, numericality: true)
メールアドレスやURLなどは正規表現でフォーマットチェックということもできるようです。
A項目が未入力の時はB項目が~というような複数項目にまたがるチェックはチェックロジックをかく他ないのでしょう。
ここではまだ定義したに過ぎないので、バリデーションチェックを呼びださないと何も起こりません。
validationの呼び出し
まずはチェックするだけして、結果をtrue or falseを得るだけの方法です。
user.valid?
false
user.errors.full_messages
["Name can't be blank"]
この方法はあまり使わないのではないかと思います。自前でfalseをハンドリングして処理する方法だと、えてして忘れます。私の場合は下記のように、エラーを発生させてエラー処理(rescue)に移してしまうようにしました。
登録、更新ロジックの細部の実装をしているときには、ユーザが入力した値は正しい前提で考えておかないと集中力が続きません。ユーザの入力値が正しいかどうかは最初にやってしまい、後続では登録ロジックのほうに集中できるようしたいと思っています。
def update
begin
form = params.require(:form_settings).permit(
:user_name
)
@form = FormSettings.new(form)
@form.validate!
User.transaction do
#省略
#ヘルパーの登録処理やらメール送信やらを呼び出し。
end
flash[:success] = "反映しました."
redirect_to (setting_path)
rescue => e
obj = errorHandling(e)
flash.now[:danger] = obj[:message]
render 'settings/edit'
end
end
validation!という破壊的メソッドでチェックすることでエラーハンドリングを1か所で行うようにしてあります。ほかにも、create!などでもエラーが発生するのでrescueに制御が移るはずです。
validationに関して詳細は下記のガイドに書かれています。