Rails6の勉強を始めています。「Rails2で作ったものをRails4に載せ替えたもの」をRails6に載せ替えています。
localでのdevelopmentでは一応動くようになったので、AWS Linux2に載せたところで遊ばれています。
login に成功しても current_user が nilのままです。
Deviseをそのまま使っていたのですが、解析がややこしいため(Deviseが必要な仕掛けも無いので) has_secure_passwoerd に急遽書きなおして見た所、session[:user_id] が消えている事がわかりました。
class ApplicationController < ActionController::Base protect_from_forgery :except => :complete helper_method :current_user, :logged_in? def current_user logger.debug("## session#create ## session_id=#{session[:session_id]},user_id=#{session[:user_id]},") @current_user ||= User.find_by(id: session[:user_id]) end def logged_in? current_user.present? end end class Users::SessionsController < ApplicationController def create user=User.find_by(username: params[:user][:username]) if user&&user.authenticate(params[:user][:password]) log_in user logger.debug("### current_user # session_id=#{session[:session_id]},user_id=#{session[:user_id]},") redirect_to root_path, success: 'ログインしました' else flash.now[:danger]='ログインに失敗しました' render :new end end def log_in(user) session[:user_id]=user.id end end
- loginはできているか? => できている
正しくないpasswordで行うとSessionsController#create のelseでnewに戻ります。
正しいpasswordですと root_pathにリダイレクトします。
しかし current_userはnilのためroot_pathが 非loginのメニューのまま
- session[:user_id]が「設定されたのにnilになってしまう」のはどう確認したか。
SessionsController#create と def current_user でlogを取った所以下の様になる。
user_idが1で有ったものがnilになっている(session.keysに"session_id", "_csrf_token"しかありませんでした)
## session#create ## session_id=,user_id=1,
### current_user # session_id=c45037aeed8561309d232a3886e7ab91,user_id=
- ん??『正しく』設定されていないのか?
log_in でsession[:user_id]を設定した直後のsession[:session_id]がnilの様だ。
だから session_id=c450....b91 なsessionにはuser_idがない!
とここまで追ってきました。
もしかしたらブラウザーがクッキー拒否ってる? のかとも思いsession_idを確認したところ 3 に気づいた次第です。login画面からのcreateでsession_idがないというのが理解不能でどこを見て良いものか見えなくなってしまいました。
助言いただけると助かります。
rails6以外につけたほうがよいタグがありましたらそれもお願いします。
#追記
no1knowsさんの助言にしたがって、一歩づつUPしてみたのですがだめでした。
勉強で始めているのですから ゼロベースで作ってみることにします
#解決しました
nginxの設定を「とりあえず動かす」で手抜きしていたのが原因でした。
同じようなボケかます人がいるかもしれないので
ここが参考になります
回答1件
あなたの回答
tips
プレビュー