こんばんは
アロハな男、やすのりです!
今日はポートフォリオ作成中にモデルのバリデーションでハマった話をしていきたいと思います!!
もしかしたら明日は我が身かも...?
#結論
Userモデルのパスワードへのバリデーションは
on: :create
を使おう!
#ハマった時の状況
え、いやどういうこと...?
となってしまうと思うので、順を追って説明していきます。
まずポートフォリオではユーザーが会員登録された場合は、専用のマイページがあったり口コミ投稿ができたりする機能をRailsのGemであるdevise
で作成していました。
そんな機能の中で、マイページで行える**『自身のユーザー情報変更機能ページ』**で事件が起こりました...
#何があったのか?
ユーザー情報の変更ページではユーザー名やアイコン画像等を変更することができるページなんですが、devise
を使用していると通常は変更の際に毎回パスワードの入力が必要になります。
ただ、『少しの変更で毎回パスワードを入力するのは面倒だなぁ...』という人のために、パスワードを入力しなくても良い様にするメソッドをdevise
は用意してくれています。
protected
def update_resource(resource, params)
resource.update_without_password(params)
end
最初はこのメソッドはコメントアウトされているので、コメントアウトを外すことでユーザー情報更新の際でもパスワードを入力しなくてもよくなるはずでした。
しかし実際に変更内容を入力して更新ボタン
を押してみると...
『あれ...え、なんで!?パスワードの入力を求められたぞ...!?』
もちろん、この状況でパスワードと確認用パスワードを入力して更新ボタン
を押すとユーザー情報が更新されはするんですけど...
俺が欲しかったのはこんなよくわかんない機能じゃな〜い!!
ということで、いろいろ調べてみると原因が判明しました。
#原因
察しのいい方はもうお気づきかもしれませんが...
そう、今回の事象の原因はUserモデルで設定したパスワードのバリデーション
のせいだったんです!!
どういうことかと言うと、今回パスワードのバリデーションとして
presence: true(カラムが空だと登録されないオプション)
を設定していたんですが、このカラムが空だと登録できない
という部分が効いてしまっていたんです...!!
つまり、
Userモデル『お、ユーザー情報を更新するぞ〜』
↓
Userモデル『deviseのコントローラーでパスワードがいらない設定もできてるな〜』
↓
Userモデル『あれ、でもモデルのバリデーションでパスワードが必要だな...』
↓
Userモデル『はい、パスワードも入力してくださ〜い』
と言う流れになっていた様です...なんという...
#解決策
原因がわかればあとは簡単です。
パスワードに適用されていたバリデーションをユーザー登録の時だけかかる様に設定しなおせば良いだけです。
そこで冒頭でお見せした、
on: :create # コントローラーのcreateアクションの時のみ動作する様にするオプション
が必要になります!
今回の私のコードで書くと
with_options presence: true do
# ユーザー新規登録時のみバリデーションを適用する。
with_options on: :create do
validates :password
validates :password_confirmation
end
end
※いろいろ他にもバリデーションを記述はしていますが、パスワードだけを抜き出しています。
さぁ、これで無事にユーザー情報が更新される様になりました!
めでたしめでたし
#最後に
ユーザー機能もパスワードのバリデーションも比較的多くのアプリで必要になってくる機能だと思いますので、もし同じ様なことがあった際は参考にしてみてください!
この件に関するご指摘・アドバイスはどんどんいただきたいと思っていますので、コメントお待ちしています!!