例えば、validatesを使って、パスワードカラム(:password)を検証すると最初は以下のように記述すると思います。パスワードはBCryptを使って『:hashed_password』に保存しているとします。パスワード更新時も検証したいときは『on: :update』も用意すれば検証ができます。

model/user.rb

validates :password, 
      on: :create,
      presence: { message: "パスワードを入力して下さい" },
      confirmation: { allow_blank: true }

model/user.rb

def password=(raw_password)
  if raw_password.present?
    self.hashed_password = BCrypt::Password.create(raw_password)
  end
  @password = raw_password
end

パスワードを使わず、ユーザ情報を更新できるようにしたい

 上記のように、『on: :update』で記述してしまうと、ユーザ情報更新ページを作った時にControllerで@user.saveしようとすると、『:password』のvalidatesが走ってしまいます。しかし、ログイン済みでユーザ情報だけ更新するのにパスワード入力を要求するのはユーザにとっては不便です。

 そこで『with_options』を利用するのが得策かと思います。下記のように『with_options』ブロックで記述すると『:password』のデータがあるときだけvalidatesが実行されます。つまり、viewsで『:password』のフォームを作らなければ、validatesが実行されなくなります。

model/user.rb

with_options if: :password do |user|
  user.validates :password, 
    on: :create,
    presence: { message: "パスワードを入力して下さい" },
    confirmation: { allow_blank: true } 
  user.validates :password, 
    on: :update,
    presence: { message: "新しいパスワードを入力して下さい" },
    confirmation: { allow_blank: true }
end

 ログインを要求するサービスを作るときは使う機会があると思いますので覚えておくと便利かもしれません。

参考

Ruby – paramがなければModelのValidationをskipすれば良いじゃない – Qiita