起こった問題
Webサービスを作ろうとUserモデルを作成。
とりあえずRailsチュートリアルに倣って進めるも、Deviseが使いたくなったので途中で方針転換。
メール認証機能を作ったところでDeviseを導入、作り直すことに。
ユーザーの作成はできた(?)がどうもログインができず。
(エラーは出ないが「メールアドレスまたはパスワードが正しくない」と言われる。)
※もちろん正しいものでトライしてます。
結論
UserモデルにRailsチュートリアル内で作った名残が残っていたせいで不具合が起き、
encrypted_passwordにパスワードが保存されなかったことが原因でした。
class User < ApplicationRecord
(以下抜粋)
attr_accessor :remember_token, :activation_token, :activation_digest, :password_digest #←ここ消す
has_secure_password #←ここ消す
Deviseでいいようにやってくれるのでhas_secure_password
とpassword_digest
属性は不用。消しましょう。ということでした。
残してると色々メソッド名やらなんやらがバッティングしちゃってうまくいきません。
潔く思い出はさよならしましょう。
解決に至った経緯
とりあえずブラウザで作ったユーザーをコンソールで見てみる。
#ブラウザから作ったユーザーを取得
user = User.last
user.valid?
=> false
user.encrypted_password
=> ""
user.valid?
がfalse
。
user.encrypted_password
が""
。
あれ、パスワード保存されてなくない?
疑惑① フォームからパスワードの送信or保存が上手くいってない?
であれば、コンソール上でユーザーを作成してみる。
user2 = User.new(name: "Test Taro", email: "test@example.com", password: "password", password_confirmation: "password")
user2.valid?
=> true
user2.valid?
がtrue
になったのでログインいけるかな?と思いきや
やはりアドレスかパスワードが違うと言われログインできない。
コンソールで見てみると
user2.encrypted_password
=> ""
user2.password
=> "password"
やっぱりencrypted_password
が保存されてない。
一応、user
のpassword
属性には値が入っている。
であればフォームのせいではなさそう。(自動生成されたものからいじってないし)
疑惑② もともと作っていたパスワード周りの何やかんやが悪さしているな。
一旦models/user.rb
を見返す。いらないものは消していこう。
has_secure_password
不要! →消す
→ログインを試みる
→エラー発生
ArgumentError in Devise::SessionsController#create
wrong number of arguments (given 1, expected 0)
Extracted source (around line #67):
def password=(new_password)
@password = new_password
self.encrypted_password = password_digest(@password) if @password.present? #ここに赤線入ってる
end
# Verifies whether a password (ie from sign in) is the user password.
引数いらないのに1個渡しちゃってるらしい。
何か思い当たる節は・・・ ん、password_digest
という聞き覚えのある単語・・!!!
attr_accessor
に:password_digest
が残ってたので消す
→解決!!!!
参考
【Rails】devise実装後のユーザー新規登録時のエラー[ArgumentError in Users::RegistrationsController#create]