質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.47%
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

4552閲覧

パスワードにバリデーションをかけるとユーザーの編集ができない

退会済みユーザー

退会済みユーザー

総合スコア0

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

パスワード

パスワードは主に情報にアクセスする際に扱われます。主に、アクセス可能なユーザーを限定する手段として使われます。

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

2クリップ

投稿2020/09/11 11:12

編集2020/09/11 13:01

前提・実現したいこと

deviseを使用してユーザー機能をつけました。
そこで、パスワードに英数字8文字のバリデーションをかけたのですが、すると今度はユーザー編集ができなくなってしまいました。

該当のソースコード

パスワードのバリデーション(文字制限はdeviseの設定を変えています)

rails

1 VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 2 validates :name, presence: true 3 validates :password, format: { with: VALID_PASSWORD_REGEX }

ユーザー編集のビュー(パスワードの入力フォームはありません)

rails

1<div class="account-page"> 2 <div class="account-page-title"> 3 アカウントの編集 4 </div> 5 <%= form_with model: current_user, local: true do |f|%> 6 <div class="account-page-form"> 7 <div class='field'> 8 <%= f.label "お名前" %> 9 <%= f.text_field :name, autofocus: true, class: 'field-input'%> 10 </div> 11 <div class='field'> 12 <%= f.label "メールアドレス" %> 13 <%= f.email_field :email, class: 'field-input'%> 14 </div> 15 <%= f.submit "保存する", class: 'btn'%> 16 <%= button_to "キャンセル", user_path(current_user),method: :get, class: "cancel" %> 17 </div> 18 <% end %> 19</div>

試したこと

https://github.com/heartcombo/devise/wiki/How-To:-Set-up-simple-password-complexity-requirements

こちらを参考に、以下のように編集したのですが、今度はバリデーションがかからなくなってしまいました。(編集はできます)

rails

1 2 validate :password_complexity 3 def password_complexity 4 return if password.blank? || password =~ /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 5 end

また、バリデーションをかけなければユーザー編集は可能です。
まさかバリデーション をかけたら編集はできないなんてことはないと思うのですが、、。
ご存知の方いらっしゃいましたら原因などご教授いただけませんでしょうか。

補足情報(FW/ツールのバージョンなど)

rails 6.0
devise 4.7.2

エラー表記の追記

下記のバリデーションを設定し、英数字8文字以上のパスワードを用いて新規ユーザーを作成しました。(ここではちゃんと英字のみのパスワードは設定不可でした)

rails

1 VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i 2 validates :name, presence: true 3 validates :password, format: { with: VALID_PASSWORD_REGEX }

次にusersコントローラーのupdateアクションに!を追加してユーザー編集を行ったところ、

rails

1 def edit 2 end 3 4 def update 5 if current_user.update!(user_params) 6 redirect_to user_path(current_user) 7 else 8 render :edit 9 end 10 end 11 12 private 13 def user_params 14 params.require(:user).permit(:name, :email) 15 end

このようなエラーメッセージが出ます。
 error

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

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

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

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

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

no1knows

2020/09/11 11:21

うる覚えながら・・・ユーザーの編集ページは、パスワードの入力が必須だったように思います。
退会済みユーザー

退会済みユーザー

2020/09/11 11:24

それが、パスワードの入力がなくてもユーザーの編集はできるのです、、。 バリデーションをかけた途端にパスワードが不正です!と言われてユーザーの編集ができなくなってしまうのです、、。
ockeghem

2020/09/11 11:56

パスワードが不正です!となるパスワード例を教えて下さい
退会済みユーザー

退会済みユーザー

2020/09/11 13:02

質問を見てくださってありがとうございます! エラー情報を追記しました! パスワードが不正です!となったときのユーザーのパスワードは英数字8文字に設定してありました。
ockeghem

2020/09/11 13:12

ストロングパラメータにnameとemailしか記載されていないので、passwordが渡ってないようですね
ockeghem

2020/09/11 14:15

「結果は変わらない」ということですが、細部は変わっているはずですので、画面キャプチャを貼ってください
guest

回答1

0

ベストアンサー

validationを書けたことによって、つねに password が必須になってしまっています。
登録時は必須ですがあとはpassword変更の時だけでしょう。
なので、
validates :password,

on: :create
optionを追加してください

投稿2020/09/11 22:05

winterboum

総合スコア23360

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

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

退会済みユーザー

退会済みユーザー

2020/09/12 03:25

できました!! onオプションの存在を初めて知れて、大変学びになりました。 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問