Ruby on Rails会话[:user_id]未正确设置

时间:2017-03-25 07:50:12

标签: ruby-on-rails ruby session

我创建了一个登录控制器,一旦用户登录,他将被定向到他的主页。如下所示,我在登录控制器中设置会话变量。在应用程序控制器中,我有当前的用户方法,它将检查用户是否存在当前登录的密钥。虽然我成功登录,但如果我稍后使用ApplicationController中给出的'current_user方法',它会将我重定向到登录页面,因为current_user是一个nil对象。有没有人知道我哪里出错了。

class User::Signin::LoginController < ApplicationController

def login
render('/login')
end

def attempt_login
    @user = User.find_by_email(params[:user][:email])
    if @user && @user.authenticate(params[:user][:password])
      session[:user_id] = @user.id
      flash[:notice] = "You are now logged in"


      if @user.role == 1

        redirect_to controller: '/patient/home', action: 'show', :id => @user.patient_id
      end

      if @user.role ==2
        redirect_to controller: '/doctor/home', action: 'show', :id => @user.doctor_id
      end

      if @user.role ==3
        redirect_to controller: '/staff/home', action: 'show', :id => @user.staff_id
      end


    else
      flash.now[:notice] = "Invalid username/ password combination."
      render 'login/login'
    end
  end

 def logout
    session[:user_id] = nil
    flash[:notice] = 'logged out'
    redirect_to('/login')
  end

end

ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery

  helper_method :current_user

  def current_user
    @current_user ||= User.find_by_id!(session[:user_id]) if session[:user_id]
  end

  def require_user
    redirect_to '/login' unless current_user
  end

  def require_admin
    redirect_to '/login' unless current_user.admin?
  end

  def require_doctor
    redirect_to '/login' unless current_user.doctor?
  end

  def require_patient
    redirect_to '/login' unless current_user.patient?
  end

  def require_staff
    redirect_to '/login' unless current_user.staff?
  end

  private
  def confrim_logged_in
    unless session[:user_id]
      flash[:notice] = "Please log in"
      redirect_to '/login'
    end
  end


end

使用current_user

class Patient::HomeController < ApplicationController
  layout 'patient'
  protect_from_forgery

  def show
    @patient = Patient.find(params[:id])
    @current_user=current_user
    render('patients/home')
  end


end

2 个答案:

答案 0 :(得分:0)

尝试以下示例,希望这有帮助

def view_takeQuiz(request,question):
    try:
        myquest = Question.objects.get(question = question)
        context = {'question': myquest.question, 'answerA': myquest.answerA, 'answerB': myquest.answerB,
               'answerC': myquest.answerC,'answerD': myquest.answerD,
               'correctAnswer': myquest.correctAnswer}
        return render(request, 'multipleChoice/takeQuiz.html', context)
    except:
        return render(request, 'multipleChoice/quiz.html', {})

答案 1 :(得分:0)

我能够通过从params [:user] [:email]更改为params [:session] [:email]来更正错误。这样做会导致我相应地更改视图变量。

def attempt_login
    @user = User.find_by_email(params[:session][:email])
    if @user && @user.authenticate(params[:session][:password])
      session[:user_id] = @user.id
      flash[:notice] = "You are now logged in"

//other code//

end