LoginSignup
1
3

More than 3 years have passed since last update.

【Rails】updateアクション実行時にパスワードなどのバリデーションを通過させる方法

Posted at

ユーザーのプロフィール情報を更新して保存するといった処理を実装するとき、ユーザーが変更したい情報のみを入力して、そのほかのフォームのバリエーションチェック(特にパスワード)はスキップさせたい!といった場面ってあるかと思います。今回はそのやり方を紹介します。

実装方法

バリデーションオプションにある、:onオプションを使います。例えばon: :createとすることによってレコードの新規作成時のみバリデーションチェックを行うことができます。
私の場合、利用規約と個人情報のチェック(acceptedカラム)にもバリデーションチェックを行っていたため、updateアクション時にもこのバリデーションチェックが発動してしまい、ユーザー情報の変更ができないという状態になってしまっていました。:onオプションでユーザーの新規登録時のみバリデーションチェックを行うようにすることで、これを回避することができます。

user.rb
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アクション実行時のみバリデーションをスキップさせることができます。

今回のは個人開発でまだ規模は小さいですが、規模が大きいサービスでは何気ないバリデーションの変更はアプリに大きな影響を与えそうだなと感じましたね。。
バリデーションはグローバルに定義するのではなく、なるべく条件を限定して影響する範囲を少なくするよう心掛けたいです!

最後まで読んでいただきありがとうございます!

日々学んだことをアウトプットしてます!何かご指摘などありましたらコメント頂けますと幸いです。

1
3
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
1
3