ユーザーのプロフィール情報を更新して保存するといった処理を実装するとき、ユーザーが変更したい情報のみを入力して、そのほかのフォームのバリエーションチェック(特にパスワード)はスキップさせたい!といった場面ってあるかと思います。今回はそのやり方を紹介します。
実装方法
バリデーションオプションにある、:onオプション
を使います。例えばon: :create
とすることによってレコードの新規作成時のみバリデーションチェックを行うことができます。
私の場合、利用規約と個人情報のチェック(acceptedカラム)にもバリデーションチェックを行っていたため、updateアクション時にもこのバリデーションチェックが発動してしまい、ユーザー情報の変更ができないという状態になってしまっていました。:onオプション
でユーザーの新規登録時のみバリデーションチェックを行うようにすることで、これを回避することができます。
validates :password, presence: true, length: { minimum: 6 }, on: :create
validates :accepted, acceptance: { message: 'をチェックしてください' }, on: :create
このようにアクションを指定することができます。
他にも:onオプション
ではカスタムコンテキストも定義できるそうです!
詳しくはRailsガイドのこちらの項目をご覧ください。
また、パスワードの場合は allow_nil: true
としてしてやっても同じことができます。
これは、値がnilの場合はバリデーションを行わないオプションです。
え?これ指定したら空のパスワード保存されちゃわない??と思いますが、has_secure_passwordで(だいだいgem 'bcrypt'を使っていますよね)オブジェクトが作られるタイミングで存在性の検証が行われるようになっているので、空のパスワードがDBに保存されることはありません。
ですので、うまいことupdateアクション実行時のみバリデーションをスキップさせることができます。
今回のは個人開発でまだ規模は小さいですが、規模が大きいサービスでは何気ないバリデーションの変更はアプリに大きな影響を与えそうだなと感じましたね。。
バリデーションはグローバルに定義するのではなく、なるべく条件を限定して影響する範囲を少なくするよう心掛けたいです!
最後まで読んでいただきありがとうございます!
日々学んだことをアウトプットしてます!何かご指摘などありましたらコメント頂けますと幸いです。