teratail header banner
teratail header banner
質問するログイン新規登録
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

845閲覧

Rails update時にpassword_confirmationがvalidatesにかからない

yupapapa

総合スコア24

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/01/19 15:07

0

0

Userをupdateする際、password(bcrypt使用)の値を入力しなくても、updateできるように実装しました。

本来、password、password_confirmationを空のままにするとupdateできる。
passwordのみ入力しupdateを行うと、validateに引っかかりrenderされる。

のですが、パスワード確認用フォーム(password_confirmation)のみ入力しupdateを行うと、validateに引っかかることなく、redirectされてしまいます。(passwordの更新はされない)

password_confirmationのみ入力時にもvalidateにかけてrenderを行いたいのですが、allow_blankオプションを使用しているためか、スキップされてしまいます。
confirmationにもallow_blankを設定してみたのですが、validateにかかってしまい空の場合ではupdateできなくなってしまいます。
解決策はありますか? ご教授願います。

validates :password, presence: true , confirmation: true, length: { in: 6..50, message: 'は6〜50文字で記入してください'}, allow_nil: true, on: :update

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoharat

2020/01/22 06:33

view から送られてきたパラメータ(params)を、コントローラがどのように User モデルに渡しているのか見せてください。
shinoharat

2020/01/22 08:30

回答を書きました。 ↑ の件を尋ねた理由なんですが、 画面上の入力欄を空欄にしてデータを送っても params[:password] には空文字が入ってるはず。 ↓ でも質問文の validates では allow_nil を使っている。 ↓ ということは controller で空文字→nilに変換するようなコードを書いているっぽいな。 一応それを見てから回答しようかな。 という思考の流れでした。 でも、途中で空文字と nil を区別しなくても大丈夫なやり方を思いついたので回答してしまいました。 (気まぐれでごめんなさい)
guest

回答1

0

ベストアンサー

allow_nil ではなく if オプションを使い、 「パスワードまたはパスワード(確認)のどちらかが入力されたなら検証する」 というコードに変えてはどうでしょうか?

rb

1# [前提] 2# User クラスには has_secure_password 的な何かしらが記述済みとする 3# 4class User < ApplicationRecord 5 6 ・・・ 7 8 validates :password 9 presence: true, 10 confirmation: true, 11 length: { in: 6..50, message: 'は6〜50文字で記入してください' }, 12 if: :password_was_entered?, 13 on: :update 14 15 private 16 17 def password_was_entered? 18 password.present? || password_confirmation.present? 19 end 20end

--

動作確認

rb

1[1] pry(main)> User.first.update!(password: '', password_confirmation: '') 2=> true 3 4[2] pry(main)> User.first.update!(password: 'abc123', password_confirmation: '') 5ActiveModel::ValidationError: バリデーションに失敗しました: Password confirmationとPasswordの入力が一致しません。 6 7[3] pry(main)> User.first.update!(password: '', password_confirmation: 'abc123') 8ActiveModel::ValidationError: バリデーションに失敗しました: Password confirmationとPasswordの入力が一致しません。 9 10[4] pry(main)> User.first.update!(password: 'abc123', password_confirmation: 'abc123') 11=> true

投稿2020/01/22 08:17

shinoharat

総合スコア1685

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yupapapa

2020/01/22 13:42

実装することができました。動作確認までしてくださりありがとうございました。すごくためになります!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問