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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

バリデーション

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

Q&A

解決済

1回答

2113閲覧

【devise】アカウント情報編集時に、パスワードのバリデーションに引っかかる

miyaengineer

総合スコア4

Devise

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

バリデーション

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

0グッド

1クリップ

投稿2021/05/10 16:04

前提・実現したいこと

お世話になります。
現在railsを用いてオリジナルアプリケーションの開発をしているプログラミング初学者です。
簡単なレビューサイトを作成しております。
ユーザー機能にdeviseを使用しています。
マイページ機能を実装し、アカウント情報を編集する機能を実装したのですが、正しく「email」「pasword」「nickname(追加カラム)」を入力すると、自分がユーザー新規登録時に設けたバリデーションに引っかかってしまいます。

ユーザーモデルに記載したバリデーション

ruby

1 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze 2 validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください'

新規登録時は正しく作動し、ユーザー登録ができます。
編集時だけ、このバリデーションに必ず引っかかるのが解消できません。
どなたかお力添えいただけないでしょうか。
よろしくお願いいたします。

各コード

Userモデル

ruby

1class User < ApplicationRecord 2 devise :database_authenticatable, :registerable, 3 :recoverable, :rememberable, :validatable 4 5 PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze 6 validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください' 7 8 validates :nickname, presence: true 9 10 has_many :reviews 11 has_many :comments 12 13 # ゲストログインするため 14 def self.guest 15 find_or_create_by!(email: 'guest@example.com') do |user| 16 user.password = SecureRandom.hex(10) 17 user.nickname = "GuestUser" 18 end 19 end 20end
アカウント情報編集ビューファイル

erb

1<div class="user-edit-contents"> 2 <h1>プロフィール編集</h1> 3 <div class="user-edit-form"> 4 <%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %> 5 <%= render "devise/shared/error_messages", resource: resource %> 6 7 <div class="field"> 8 <%= f.label :email %><br /> 9 <%= f.email_field :email, autofocus: true, autocomplete: "email" %> 10 </div> 11 <div class="field"> 12 <%= f.label :nickname %><br /> 13 <%= f.text_field :nickname, autofocus: true, autocomplete: "nickname" %> 14 </div> 15 16 <div class="field"> 17 <%= f.label :password %><br /> 18 <%= f.password_field :password %> 19 </div> 20 21 <div class="field"> 22 <%= f.label :password_confirmation %><br /> 23 <%= f.password_field :password_confirmation %> 24 </div> 25 26 <div class="actions"> 27 <%= f.submit "保存" %> 28 </div> 29 <% end %> 30 31 <%= link_to "戻る", user_path(current_user.id) %> 32 </div> 33</div>
deviseのregistrationコントローラー

アカウント情報更新時に「現在のパスワード」入力を不要にしております。

ruby

1class Users::RegistrationsController < Devise::RegistrationsController 2 3 protected 4 5 def update_resource(resource, params) 6 resource.update_without_password(params) 7 end 8 9 #更新後のパスを指定 10 def after_update_path_for(resource) 11 user_path(@user.id) 12 end 13end
application_controller.rb deviseのストロングパラメーターを記載

ruby

1class ApplicationController < ActionController::Base 2 before_action :configure_permitted_parameters, if: :devise_controller? 3 4 private 5 def configure_permitted_parameters 6 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) 7 devise_parameter_sanitizer.permit(:account_update, keys: [:nickname]) 8 end 9end

エラーログ

アカウント情報編集のための各フォームを正しく入力し、保存した際のエラーログです。

Started PUT "/users" for 172.24.0.1 at 2021-05-10 15:46:08 +0000 Cannot render console from 172.24.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by Users::RegistrationsController#update as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"testtest@test.com", "nickname"=>"bikke2", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"保存"} User Load (1.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 ORDER BY `users`.`id` ASC LIMIT 1 User Load (1.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1 Rendering layout layouts/application.html.erb Rendering devise/registrations/edit.html.erb within layouts/application Rendered shared/_second_header.html.erb (Duration: 11.5ms | Allocations: 678) Rendered devise/shared/_error_messages.html.erb (Duration: 1.0ms | Allocations: 354) Rendered devise/registrations/edit.html.erb within layouts/application (Duration: 44.3ms | Allocations: 2420) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 97.6ms | Allocations: 7834) Completed 200 OK in 114ms (Views: 101.3ms | ActiveRecord: 2.5ms | Allocations: 12206)

何か必要な追加情報があればおっしゃってください。
お手を煩わせて恐縮ですが、何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

validatable.rbを参考に

ruby

1validates_format_of :password, with: PASSWORD_REGEX, message: 'には英字と数字の両方を含めて設定してください', if: :password_required?

などはいかがでしょうか?

投稿2021/05/10 21:58

asm

総合スコア15149

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

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

miyaengineer

2021/05/11 11:56

asm様 ご回答いただきありがとうございます! 無事解決いたしました。 勉強不足で申し訳ないのですが、もしよろしければ教えてください。 今回の件は、deviseで用意されている、パスワードの有無を確認する「password_required」メソッドを用いることで、自分で用意した正規表現のバリデーションが正しく適用された、と仮説を立てております。 つまり、この正規表現バリデーションは「password_required」メソッドがない限り、編集画面でのパスワード入力項目をパスワードと認識していないため、どれだけ正しく入力してもバリデーションに引っかかったという認識でよろしいでしょうか? もしよろしければasm様の見解もお聞きできたらと思います。
asm

2021/05/11 16:40

> パスワードの有無を確認する「password_required」メソッドを用いること 正確には、パスワードが「必要かを確認」する「password_required?」メソッドです。 保存済みのレコードかつパスワードを変更しない場合はパスワードを要求しない よって、パスワードのvalidateも行わない というのがDeviseの方針なので、あなたが追加したvalidateにも同様の条件をつけるとよいかと提案しました。 > つまり、この正規表現バリデーションは「password_required」メソッドがない限り、編集画面でのパスワード入力項目をパスワードと認識していないため まず、Deviseを用いてる時点で「password_required?」メソッドは存在します。 password_required?は関係なくupdate_without_passwordの時点でパスワードは無視されます。 https://github.com/heartcombo/devise/blob/57d1a1d3816901e9f2cc26e36c3ef70547a91034/lib/devise/models/database_authenticatable.rb#L139
miyaengineer

2021/05/25 08:37

asm様 懇切ご丁寧にご解説いただき恐縮です。 非常に勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問