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)に遷移します