Deviseでsign_inしたユーザー情報を更新するとログアウトしてしまう
解決したいこと
RailsアプリにてDeviseをカスタマイズして使用しています。
userに対してsign_in
メソッドをした後にユーザー情報を更新するとログイン状態を失ってしまうのを解決したいです。
発生している問題・エラー
sign_in
後にusers/resistrations#update
するとログアウトしてしまう。
考えられる原因
- user情報がcookieに保存されていない?
- ログイン中の
user_session
の中身が空
該当するソースコード
GitHub
# frozen_string_literal: true
class Users::RegistrationsController < Devise::RegistrationsController
def new
@user = User.new
end
def create
@user = User.new(users_params)
if @user.save
sign_in(:user, @user)
redirect_to categories_path, notice: "新規ユーザー「#{@user.name}」を登録しました。"
else
render 'new'
end
end
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(params[:id])
if @user.update(users_params)
redirect_to categories_path, notice: "ユーザー「#{@user.name}」を更新しました。"
else
render 'edit'
end
end
private
def users_params
params.require(:user).permit(:name, :email, :password)
end
end
# frozen_string_literal: true
class Users::SessionsController < Devise::SessionsController
def new
end
def create
@user = User.find_by(email: params[:session][:email])
if @user.valid_password?(params[:session][:password])
sign_in(@user)
@user.update!(remember_created_at: Time.zone.now) # ログインと同時にremember_created_atをtrueにしたが効果なし
redirect_to categories_path, notice: "#{@user.name} としてログインしました"
else
render 'new', notice: "ログインに失敗しました"
end
end
def destroy
super
end
private
def sessions_params
params.require(:session).permit(:email, :password)
end
end
ログイン前のセッション情報
#<ActionDispatch::Request::Session:0x0000ffff88e89418 @by=#<ActionDispatch::Session::CookieStore:0x0000aaaad8146850 @app=#<ActionDispatch::ContentSecurityPolicy::Middleware:0x0000aaaad8146a80 @app=#<ActionDispatch::PermissionsPolicy::Middleware:0x0000aaaad8146be8 @app=#<Rack::Head:0x0000aaaad8146d28 @app=#<Rack::ConditionalGet:0x0000aaaad8146eb8 @app=#<Rack::ETag:0x0000aaaad81470e8 @app=#<Rack::TempfileReaper:0x0000aaaad8147228 @app=#<Warden::Manager:0x0000aaaad8147660 @config={:default_scope=>:user, :scope_defaults=>{}, :default_strategies=>{:user=>[:rememberable, :database_authenticatable]}, :intercept_401=>false, :failure_app=>#<Devise::Delegator:0x0000aaaad8d98b30>}, @app=#<ActionDispatch::Routing::RouteSet:0x0000aaaad60bfa50>>>, @cache_control="max-age=0, private, must-revalidate", @no_cache_control="no-cache">>>>>, @default_options={:path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :defer=>false, :renew=>false}, @key="_myapp_session", @cookie_only=true, @same_site=nil>, @req=#<ActionDispatch::Request GET "http://localhost:3000/" for 172.24.0.1>, @delegate={"session_id"=>"3e0f96fd619df6bf8577df7f6428c8ce", "_csrf_token"=>"IvC9M-tK54_GQq61E-NVvdnU9eyRA4vR9_WbdCQh6GM=", "warden.user.user.session"=>{}, "user_return_to"=>"/categories"}, @loaded=true, @exists=true>
ログイン後のセッション情報
#<ActionDispatch::Request::Session:0x0000ffff75c70838 @by=#<ActionDispatch::Session::CookieStore:0x0000aaaad8146850 @app=#<ActionDispatch::ContentSecurityPolicy::Middleware:0x0000aaaad8146a80 @app=#<ActionDispatch::PermissionsPolicy::Middleware:0x0000aaaad8146be8 @app=#<Rack::Head:0x0000aaaad8146d28 @app=#<Rack::ConditionalGet:0x0000aaaad8146eb8 @app=#<Rack::ETag:0x0000aaaad81470e8 @app=#<Rack::TempfileReaper:0x0000aaaad8147228 @app=#<Warden::Manager:0x0000aaaad8147660 @config={:default_scope=>:user, :scope_defaults=>{}, :default_strategies=>{:user=>[:rememberable, :database_authenticatable]}, :intercept_401=>false, :failure_app=>#<Devise::Delegator:0x0000aaaad8d98b30>}, @app=#<ActionDispatch::Routing::RouteSet:0x0000aaaad60bfa50>>>, @cache_control="max-age=0, private, must-revalidate", @no_cache_control="no-cache">>>>>, @default_options={:path=>"/", :domain=>nil, :expire_after=>nil, :secure=>false, :httponly=>true, :defer=>false, :renew=>false}, @key="_myapp_session", @cookie_only=true, @same_site=nil>, @req=#<ActionDispatch::Request GET "http://localhost:3000/" for 172.24.0.1>, @delegate={"session_id"=>"022abbc009afdcb4aaf700704ab49f91", "_csrf_token"=>"IvC9M-tK54_GQq61E-NVvdnU9eyRA4vR9_WbdCQh6GM=", "warden.user.user.session"=>{}, "user_return_to"=>"/categories", "warden.user.user.key"=>[[1], "$2a$12$U.h0GdPjs5fz/Y7NkFp9w."]}, @loaded=true, @exists=true>
(↑赤文字の下に表示されている{}
はuser_session
)
自分で試したこと
-
sign_in
でログインしたユーザー情報をcurrent_user
にて取得可能 - ログイン後に
before_action :authenticate_user!
は機能している - ログイン後に
/sign_up
、/login
パスへのアクセスをブロックしている(正常) -
user_signed_in?
は機能している -
users/sessions#create
にてUserモデルのremember_created_at
に現在時刻を代入し、true
にしても効果無し - こちらのサイトの通りにしても効果なし