Ruby on rails,@current_用户在重新编辑webseite或更改页面时设置为空

Ruby 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

我已经创建了一个RubyonRails应用程序,您可以在其中创建一个帐户。然后,当您登录时,将创建一个会话。在ApplicationController.rb中,有一个before_操作,用于检查用户是否登录,但“视图注册”和“欢迎”除外。我有一个@current_user变量,当有用户登录时,它是真的。 登录工作正常。当您按下登录按钮时,会创建一个会话,但只要我重新加载页面或单击指向其他页面的链接,@current_user就等于null。 会话仍然存在,但@current_用户为false

如何让会话持续到用户单击注销按钮为止?或者如何修复@current\u用户变量

谢谢你的帮助

应用程序\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
会话\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