【Ruby on rails】エラーから学んだ、deviseのしくみ

起きたこと


ユーザー管理機能を実装するにあたり、ログイン画面で全ての項目を入力しても登録できず、ログイン画面のままになってしまう

エラー内容


ローカル環境ではエラー表示はされず、ターミナルで以下の表記


Started POST "/users" for ::1 at 2024-05-16 21:01:48 +0900
Processing by Devise::RegistrationsController#create as TURBO_STREAM
  Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"nickname"=>"ニックネーム", "email"=>"test@test", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "family_name"=>"山田", "first_name"=>"太郎", "family_name_kana"=>"ヤマダ", "first_name_kana"=>"タロウ", "birthday(1i)"=>"1995", "birthday(2i)"=>"2", "birthday(3i)"=>"28"}, "commit"=>"会員登録"}
  TRANSACTION (0.2ms)  BEGIN
  User Exists? (16.7ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'test@test' LIMIT 1
  TRANSACTION (1.8ms)  ROLLBACK
  Rendering layout layouts/application.html.erb
  Rendering devise/registrations/new.html.erb within layouts/application
  Rendered shared/_second-header.html.erb (Duration: 3.5ms | Allocations: 633)
  Rendered shared/_error_messages.html.erb (Duration: 0.7ms | Allocations: 257)
  Rendered shared/_second-footer.html.erb (Duration: 0.2ms | Allocations: 280)
  Rendered devise/registrations/new.html.erb within layouts/application (Duration: 10.0ms | Allocations: 5651)
  Rendered layout layouts/application.html.erb (Duration: 13.3ms | Allocations: 8159)
Completed 422 Unprocessable Entity in 381ms (Views: 13.7ms | ActiveRecord: 29.7ms | Allocations: 14327)

→何かしらのバリデーションでロールバックされている

先に結論から言うと、、、 モデルの入力に誤りがあった!!!
入力内容はこちら、

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :nickname, presence: true
  validates :birthday, presence: true

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

  with_options presence: true, format: {
    with: /\A[ぁ-んァ-ヶ一-龥々ー]+\z/, message: '全角文字を使用してください' } do
    validates :family_name
    validates :first_name
  end

  with_options presence: true, format: {
    with: /\A[ァ-ヶー]+\z/, message: '全角カタカナを使用してください' } do
    validates :family_name_kana
    validates :first_name_kana
  end
end

間違っていたのは、11行目。
「:encrypted_password」ではなく、「:password」と記述しなければいけなかった。

そもそも「encrypted_password」とは、
「暗号化されたパスワード」と言う意味。

ここで知ったのが、

deviseを使うと、勝手にパスワードを暗号化してデータベースに保存してくれると言うこと!!

え、じゃあ「encrypted_password」として扱えばいいのでは?と言う話ですが、
deviseに備わっている機能は、保存するタイミングで変換すると言うこと。

つまり、データベースの作成をするためのマイグレーションファイルは「encrypted_password」で記述をする。
passwordにしてしまうと保存時にちゃんとカラムがありません!というエラーが発生してしまう。

次に、ビューファイルはどうなのか。
ビューファイルは「password」として扱う。

そのため、モデルでバリデーションを設定する際も「password」として扱う必要がある。


deiviseの機能は、他にも様々あり
emailとpasswordに関するバリデーションは自動で設定されているものがあるため、基礎的な内容だと必要ない。
ただ、追加でバリデーションの設定を行う際は注意が必要ということがわかりました。

この記事が気に入ったらサポートをしてみませんか?