Ruby on rails,@current_用户在重新编辑webseite或更改页面时设置为空
我已经创建了一个RubyonRails应用程序,您可以在其中创建一个帐户。然后,当您登录时,将创建一个会话。在ApplicationController.rb中,有一个before_操作,用于检查用户是否登录,但“视图注册”和“欢迎”除外。我有一个@current_user变量,当有用户登录时,它是真的。 登录工作正常。当您按下登录按钮时,会创建一个会话,但只要我重新加载页面或单击指向其他页面的链接,@current_user就等于null。 会话仍然存在,但@current_用户为false 如何让会话持续到用户单击注销按钮为止?或者如何修复@current\u用户变量 谢谢你的帮助 应用程序\u控制器.rbRuby on rails,@current_用户在重新编辑webseite或更改页面时设置为空,ruby,session,ruby-on-rails-5,session-cookies,Ruby,Session,Ruby On Rails 5,Session Cookies,我已经创建了一个RubyonRails应用程序,您可以在其中创建一个帐户。然后,当您登录时,将创建一个会话。在ApplicationController.rb中,有一个before_操作,用于检查用户是否登录,但“视图注册”和“欢迎”除外。我有一个@current_user变量,当有用户登录时,它是真的。 登录工作正常。当您按下登录按钮时,会创建一个会话,但只要我重新加载页面或单击指向其他页面的链接,@current_user就等于null。 会话仍然存在,但@current_用户为false
class ApplicationController < ActionController::Base
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
module CurrentUserConcern
extend ActiveSupport::Concern
included do
before_action :set_current_user
end
def set_current_user
if session[:user_id]
@current_user = User.find(session[:user_id])
end
end
end
class SessionsController < ApplicationController
include CurrentUserConcern
def create
user = User.find_by(email: params["user"]["email"]).try(:authenticate, params["user"]["password"])
if user
session[:user_id] = user.id
session[:expires_at] = Time.current + 1.minutes
#render "sessionhandling/home"
render json: {status: :created, logged_in: true, user: user, expires_at: session}
else
render json: {status: 401}
end
end
def logged_in
if @current_user
render json: {logged_in: true, user: @current_user}
else
render json: {logged_in: false}
end
end
def logout
reset_session
render json: {status: 200, logged_out: true}
end
end
<h1>Home</h1>
<%= link_to "Controllpanel", sessionhandling_controllpanel_path %>
<%= link_to "Logout", logout_path %>
class ApplicationController < ActionController::Base
include CurrentUserConcern # This is missing
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
会话\u controller.rb
class ApplicationController < ActionController::Base
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
module CurrentUserConcern
extend ActiveSupport::Concern
included do
before_action :set_current_user
end
def set_current_user
if session[:user_id]
@current_user = User.find(session[:user_id])
end
end
end
class SessionsController < ApplicationController
include CurrentUserConcern
def create
user = User.find_by(email: params["user"]["email"]).try(:authenticate, params["user"]["password"])
if user
session[:user_id] = user.id
session[:expires_at] = Time.current + 1.minutes
#render "sessionhandling/home"
render json: {status: :created, logged_in: true, user: user, expires_at: session}
else
render json: {status: 401}
end
end
def logged_in
if @current_user
render json: {logged_in: true, user: @current_user}
else
render json: {logged_in: false}
end
end
def logout
reset_session
render json: {status: 200, logged_out: true}
end
end
<h1>Home</h1>
<%= link_to "Controllpanel", sessionhandling_controllpanel_path %>
<%= link_to "Logout", logout_path %>
class ApplicationController < ActionController::Base
include CurrentUserConcern # This is missing
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
class sessioncontroller
home.html.erb
class ApplicationController < ActionController::Base
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
module CurrentUserConcern
extend ActiveSupport::Concern
included do
before_action :set_current_user
end
def set_current_user
if session[:user_id]
@current_user = User.find(session[:user_id])
end
end
end
class SessionsController < ApplicationController
include CurrentUserConcern
def create
user = User.find_by(email: params["user"]["email"]).try(:authenticate, params["user"]["password"])
if user
session[:user_id] = user.id
session[:expires_at] = Time.current + 1.minutes
#render "sessionhandling/home"
render json: {status: :created, logged_in: true, user: user, expires_at: session}
else
render json: {status: 401}
end
end
def logged_in
if @current_user
render json: {logged_in: true, user: @current_user}
else
render json: {logged_in: false}
end
end
def logout
reset_session
render json: {status: 200, logged_out: true}
end
end
<h1>Home</h1>
<%= link_to "Controllpanel", sessionhandling_controllpanel_path %>
<%= link_to "Logout", logout_path %>
class ApplicationController < ActionController::Base
include CurrentUserConcern # This is missing
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
主页
您缺少此部分:
应用程序\u控制器.rb
class ApplicationController < ActionController::Base
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
module CurrentUserConcern
extend ActiveSupport::Concern
included do
before_action :set_current_user
end
def set_current_user
if session[:user_id]
@current_user = User.find(session[:user_id])
end
end
end
class SessionsController < ApplicationController
include CurrentUserConcern
def create
user = User.find_by(email: params["user"]["email"]).try(:authenticate, params["user"]["password"])
if user
session[:user_id] = user.id
session[:expires_at] = Time.current + 1.minutes
#render "sessionhandling/home"
render json: {status: :created, logged_in: true, user: user, expires_at: session}
else
render json: {status: 401}
end
end
def logged_in
if @current_user
render json: {logged_in: true, user: @current_user}
else
render json: {logged_in: false}
end
end
def logout
reset_session
render json: {status: 200, logged_out: true}
end
end
<h1>Home</h1>
<%= link_to "Controllpanel", sessionhandling_controllpanel_path %>
<%= link_to "Logout", logout_path %>
class ApplicationController < ActionController::Base
include CurrentUserConcern # This is missing
skip_before_action :verify_authenticity_token
before_action :require_login, except: [:welcome, :register, :create]
private
def require_login
unless @current_user
#reset_session
flash[:error] = "You must be logged in"
render json: {status: "You are not logged in", user: @current_user, session: session}
#render sessionhandling_welcome_path
end
end
end
class ApplicationController
此外,我还将更改
CurrentUserConcern
以处理#require_login
。无法保证在操作之前将首先运行哪个,require\u login
或set\u current\u user
即使有保证,也会让人感到困惑。我相信你需要将CurrentUserConcern
包含在ApplicationController
中。为什么要将set\u current\u user
和require\u login
这两个功能分为两个位置,根据我的理解,在require\u login
之前,您应该始终调用set\u current\u user
。