2015-06-10 5 views
0

Я сделал приложение с Rails 4, где пользователи могут получить доступ к веб-сайту только в том случае, если они зарегистрированы. Я не использовал Devise для этого, но я следил за this railcast. Он работает хорошо, но у меня проблема, когда пользователь регистрируется, он все равно может перейти на страницу входа в систему, я хочу, чтобы при попытке перейти на страницу регистрации он перенаправляется на главную страницу, но я не сделал найти способ сделать это.Запретить доступ к странице подключения, когда пользователь уже зарегистрирован

контроллер Session

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 действия и проверьте, есть ли текущий пользователь, но он не работает

+0

Где вы определяете '@ current_user'? Можете ли вы показать код? – AbM

+0

'redirect_to root_url if current_user' помещает эту строку в начало действия' new'. –

ответ

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 
0

Согласно railscast вы упомянули, нет ни одной переменной, как @current_user. Вместо этого current_user - это метод, который позволяет узнать, вошел ли пользователь в систему или нет.

@current_user был определен в current_user способе, но к вам у вас не может быть доступа к другим способам. Так что вам просто нужно использовать метод current_user следующим образом:

def new 
    redirect_to root_url if current_user 
    # other code 
end 
+0

Это могло сработать, но мне нужно установить render: layout => false, а Rails не принимает перенаправление и рендер –