用户已登录时,禁止访问连接页面

时间:2015-06-10 12:40:21

标签: ruby-on-rails authentication

我使用Rails 4创建了一个应用程序,用户只有在记录后才能访问该网站。我没有使用Devise这样做,但我跟着this railcast。它运行良好,但我有一个问题,当用户登录时,他仍然可以进入登录页面,我希望当他尝试进入登录页面时,他被重定向到主页,但我没有找到这样做的方法。

会话控制器

class SessionsController < ApplicationController

def new
  if @current_user.nil?
    render :layout => false
  else
    redirect_to root_url, :notice => "Vous êtes déjà connecté"
  end
end

  #Connexion
  def create
    user = User.authenticate(params[:email], params[:password])
    if user 
      if params[:remember_me]
      cookies.permanent[:auth_token] = user.auth_token
    else
      cookies[:auth_token] = user.auth_token  
    end
      session[:user_id] = user.id
      redirect_to root_url, :notice => "Bienvenue !"
    else
      redirect_to :connect, :notice => "E-mail ou mot de passe incorrect"
    end
  end

  def destroy
    session[:user_id] = nil
    cookies.delete(:auth_token)
    redirect_to :connect, :notice => "Déconnecté !"
  end
end

应用程序控制器

def current_user
    @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end

我尝试在我的new操作中添加一个if并检查是否有当前用户但是它不起作用

2 个答案:

答案 0 :(得分:0)

我认为你应该使用current_user而不是@current_user。在您第一次调用@current_user之前,nil的值为current_user。我建议使用before_action

class SessionsController < ApplicationController
  before_action :ensure_no_current_user, only: [:new]

  def new
    render :layout => false
  end

  private

  def ensure_no_current_user
    if current_user
      redirect_to root_url, :notice => "Vous êtes déjà connecté"
      false
    end 
  end

end

答案 1 :(得分:0)

根据您提到的railscast,没有像@current_user这样的变量。相反,current_user是一种让您知道用户是否已登录的方法。

@current_user已在current_user方法中定义,但您无法使用其他方法进行访问。所以你只需要使用方法current_user,如下所示:

def new
  redirect_to root_url if current_user
  # other code
end