Rails devise validationに引っかからない方法


どうもチャンクノです!
deviseを使用するとUserモデルを更新したりする場合必ずパスワードのparamsを送らなければいけません。
ですが、deviseのメソッドをオーバーライドすることでパスワードをparamsから省くことができます。
この方法はググればすぐに出てきますが、もしUserモデルにパスワードのバリデーションをかけていた場合paramsから省いていたとしても一生登録できません。
自分は原因に気付くまで二日かかりました。まさかvalidationだなんて思わんて、、、。
同じ問題に直面している泣きそうな人たちの救いになればと思い、今回validationに引っかからずに登録する方法を記事にします。

paramsから省く記事はこちらを参考にしました。
https://easyramble.com/user-account-update-without-password-on-devise.html

本題の内容はUser.rbに以下を記述するだけです。

  def update_without_current_password(params)
    params.delete(:current_password)

    self.attributes = params
    result = self.save(validate: false) <- 具体的にはここ。
    clean_up_passwords
    result
  end

一応説明しておくとここでいうselfっていうのはUserのことです
attributesっていうのはnewとかbuildとかと同じ感じのものらしいです。
なので、self.attributes == User.new と同じことになると思います。
で、saveする時にvalidationを効かなくすると。
これでOKです。

自分はdeviseのパスワードを省く方法すら知らなかったのでお勉強になりました。
validate: falseに関しては使用できる場面が決まっているので知らなかった人は調べてみるといいと思います。
それでは今日はこの辺で!

皆様よきプログラミングライフを🙏