rail 7 + devise 4.9 でめっちゃ詰まった。

このページは備忘録がてら残したいと思います。

※ dockerを使ってます。
※ deviseは導入済み(下記のように)
※ docker-compose exec web rails g devise:install
※ docker-compose exec web rails g devise User
※ docker-compose exec web rails g devise:views User
※ docker-compose exec web rails g devise:controllers users

本題

Login(/sign_up)の部分でログインを行っても遷移しないというエラーに出くわした。
エラーを見たところ下記のようなエラーが出ていた。

****-web-1  | Processing by Devise::SessionsController#create as TURBO_STREAM
****-web-1  |   Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"test@gmail.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Log in"}
****-web-1  |   User Load (3.0ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["email", "test@gmail.com"], ["LIMIT", 1]]
****-web-1  | Completed 401 Unauthorized in 394ms (ActiveRecord: 3.8ms | Allocations: 2821)


自分は思ったことは2つ。以下になる。

  • 401のエラーは認証のエラーなのでログイン時のパスワードやメールアドレスが間違っている
  • Processing by Devise::SessionsController#create as TURBO_STREAMとあったのでTURBO_STREAMが悪さしてる?

思ったことを1つずつ潰していこう!

ではやっていきましょう!
まず1つ目401のエラーは認証のエラーなのでログイン時のパスワードやメールアドレスが間違っている?
consoleにて下記のようにしてユーザーが存在するか確認を行います。

irb(main):003:0> user = User.find_by(email: "test@gmail.com")
  User Load (5.3ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test@gmail.com"], ["LIMIT", 1]]
=> #<User id: 4, email: "test@gmail.com", created_at: "2023-07-10 14:51:06.906726000 +0000", updated_at: "2023-07-11 13:45:09.801442000 +0000", phone: "12345678", birthday: "20200101", name: "a">

ユーザーが登録できていることは確認できました!
では次にパスワードが問題ないか確認をします。

irb(main):004:0> user.valid_password?('*******')
=> true

*******は自分の設定したパスワードに置き換えて下さい。

パスワードにも問題は見当たらないですね。

では次!
Processing by Devise::SessionsController#create as TURBO_STREAMとあったのでTURBO_STREAMが悪さしてる?

下記のサイトは環境のバージョンは違うのですが、同様の事象が起きているサイトを見つけて、viewのページでのform_forの部分にhtml: {'data-turbo' => "false"}を追加してturboを使用しなければいいのでは。とあったので追加をしたのですが、遷移しない状態は変わらず、、、。 github-com.translate.goog

んーーーと悩み色々やってみたが、4時間経過。
下記ファイルを見て:confirmable←これ!!!!!!
悪さをしていた訳ではないですが、:confirmableが有効になっていると、ユーザーが新規登録した際、またはメールアドレスを変更した際に、自動的に確認メールが送信されこれを確認しないとログインができないと!
なんと!知識不足!!

models/user.rb

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

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email, presence: true, uniqueness: true, format: { with: VALID_EMAIL_REGEX }
  validates :phone, presence: true, uniqueness: true
  validates :birthday, presence: true
end

おっとでもこのメールアドレスはテスト用で架空のアドレスなので、存在しません。
コンソールで確認メールを確認した事にしましょう!

irb(main):001:0> user = User.find_by(email: 'test@gmail.com')
  User Load (1.4ms)  SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT $2  [["email", "test@gmail.com"], ["LIMIT", 1]]
=> #<User id: 4, email: "test@gmail.com", created_at: "2023-07-10 14:51:06.906726000 +0000", updated_at: "2023-07-10 14:51:06.906726000 +0000", phone: "12345678", birthday: "20200101", name: "a">

irb(main):002:0> user.confirm
  TRANSACTION (0.5ms)  BEGIN
  User Update (1.9ms)  UPDATE "users" SET "confirmed_at" = $1, "updated_at" = $2 WHERE "users"."id" = $3  [["confirmed_at", "2023-07-11 13:45:09.800418"], ["updated_at", "2023-07-11 13:45:09.801442"], ["id", 4]]
  TRANSACTION (2.9ms)  COMMIT
=> true

irb(main):003:0> user.save
  TRANSACTION (0.8ms)  BEGIN
  User Exists? (1.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 AND "users"."id" != $2 LIMIT $3  [["email", "test@gmail.com"], ["id", 4], ["LIMIT", 1]]
  User Exists? (0.8ms)  SELECT 1 AS one FROM "users" WHERE "users"."phone" = $1 AND "users"."id" != $2 LIMIT $3  [["phone", "12345678"], ["id", 4], ["LIMIT", 1]]
  TRANSACTION (0.7ms)  COMMIT
=> true

これで確認メールの確認が完了!
再度ログインを行ってみると無事に遷移!!

とりあえず一見落着!!

p.s
ちなみにまだ原因はわかってないのですが、html: {'data-turbo' => "false"}を追加したままログインを行うと、問題なく指定したページに遷移し、html: {'data-turbo' => "false"}を外すとデフォルトのページ(root_path)に遷移します