1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsのバリデーション設定でハマった話

Last updated at Posted at 2020-12-22

こんばんは
アロハな男、やすのりです!

今日はポートフォリオ作成中にモデルのバリデーションでハマった話をしていきたいと思います!!

もしかしたら明日は我が身かも...?

#結論
Userモデルのパスワードへのバリデーションは

on: :create

を使おう!

#ハマった時の状況
え、いやどういうこと...?
となってしまうと思うので、順を追って説明していきます。

まずポートフォリオではユーザーが会員登録された場合は、専用のマイページがあったり口コミ投稿ができたりする機能をRailsのGemであるdeviseで作成していました。

そんな機能の中で、マイページで行える**『自身のユーザー情報変更機能ページ』**で事件が起こりました...

#何があったのか?
ユーザー情報の変更ページではユーザー名やアイコン画像等を変更することができるページなんですが、deviseを使用していると通常は変更の際に毎回パスワードの入力が必要になります。

ただ、『少しの変更で毎回パスワードを入力するのは面倒だなぁ...』という人のために、パスワードを入力しなくても良い様にするメソッドをdeviseは用意してくれています。

registrations_controller.rb
protected

def update_resource(resource, params)
  resource.update_without_password(params)
end

最初はこのメソッドはコメントアウトされているので、コメントアウトを外すことでユーザー情報更新の際でもパスワードを入力しなくてもよくなるはずでした。

しかし実際に変更内容を入力して更新ボタンを押してみると...

スクリーンショット_2020-12-22_22_48_09.jpg

『あれ...え、なんで!?パスワードの入力を求められたぞ...!?』
もちろん、この状況でパスワードと確認用パスワードを入力して更新ボタンを押すとユーザー情報が更新されはするんですけど...

俺が欲しかったのはこんなよくわかんない機能じゃな〜い!!

ということで、いろいろ調べてみると原因が判明しました。

#原因
察しのいい方はもうお気づきかもしれませんが...
そう、今回の事象の原因はUserモデルで設定したパスワードのバリデーションのせいだったんです!!

どういうことかと言うと、今回パスワードのバリデーションとして

presence: true(カラムが空だと登録されないオプション)

を設定していたんですが、このカラムが空だと登録できないという部分が効いてしまっていたんです...!!
つまり、

Userモデル『お、ユーザー情報を更新するぞ〜』
         ↓
Userモデル『deviseのコントローラーでパスワードがいらない設定もできてるな〜』
         ↓
Userモデル『あれ、でもモデルのバリデーションでパスワードが必要だな...』
         ↓
Userモデル『はい、パスワードも入力してくださ〜い』

と言う流れになっていた様です...なんという...

#解決策
原因がわかればあとは簡単です。
パスワードに適用されていたバリデーションをユーザー登録の時だけかかる様に設定しなおせば良いだけです。

そこで冒頭でお見せした、

on: :create # コントローラーのcreateアクションの時のみ動作する様にするオプション

が必要になります!

今回の私のコードで書くと

user.rb
  with_options presence: true do
    # ユーザー新規登録時のみバリデーションを適用する。
    with_options on: :create do
      validates :password
      validates :password_confirmation
    end
  end

※いろいろ他にもバリデーションを記述はしていますが、パスワードだけを抜き出しています。

さぁ、これで無事にユーザー情報が更新される様になりました!
めでたしめでたし

#最後に
ユーザー機能もパスワードのバリデーションも比較的多くのアプリで必要になってくる機能だと思いますので、もし同じ様なことがあった際は参考にしてみてください!

この件に関するご指摘・アドバイスはどんどんいただきたいと思っていますので、コメントお待ちしています!!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?