【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に関するバリデーションは自動で設定されているものがあるため、基礎的な内容だと必要ない。
ただ、追加でバリデーションの設定を行う際は注意が必要ということがわかりました。