2015-07-20 1 views
0

меня бесконечного цикла при обращении к индексу с неаутентифицированным пользователемкак я мог проверить аутентифицированный пользователь всех ресурсы, кроме контроллера сеанса

Как я могу избавиться от него? благодаря

ошибки

Started GET "/sessions/new" for 127.0.0.1 at 2015-07-20 18:24:58 +0800 
Processing by SessionsController#new as HTML 
Redirected to http://localhost:3000/sessions/new 
Filter chain halted as :verify_authenticity rendered or redirected 
Completed 302 Found in 5ms (ActiveRecord: 0.0ms) 
cache: [GET /sessions/new] miss 

Отрывок

class ApplicationController < ActionController::Base 
    # Prevent CSRF attacks by raising an exception. 
    # For APIs, you may want to use :null_session instead. 
    protect_from_forgery with: :exception 
    before_action :verify_authenticity, except: [:session] 

    private 
    def verify_authenticity 
     redirect_to sessions_new_url unless current_user 
    end 
end 


class SessionsController < ApplicationController 
    skip_before_action :verify_authenticity 

    def new 
    redirect_to index_url if current_user 
    end 

end 
+0

Я считаю, что у вас есть собственная реализация 'current_user', могли бы вы показать его? Убедитесь, что он возвращает nil или false, если нет аутентифицированного пользователя, а не фактического объекта! –

ответ

1

мне не нравится, как вы проверить на проверку подлинности пользователя с

redirect_to index_url if current_user 

Я предпочел бы использовать булев метод, как current_user? или user_logged_in?, который возвращает true или false ely

Почему? Ну, потому что в большинстве приложений вы по-прежнему обрабатываете неавторизованный или гостевой вход ... с экземпляром пользователя! Итак, вы ВСЕГДА имеете переменную экземпляра current_user, но, возможно, с полями nil (например, login: nil, email: nil).

Пример current_user аутентификации, полностью пресекает ваше if условие:

def current_user 
    if @current_user 
    return @current_user 
    else 
    @current_user = User.new 
    @current_user.try_to_authenticate_with_params 
    end 
end 

Так в основном, когда вы звоните

redirect_to index_url if current_user 

Он всегда будет перенаправлять, потому что current_user возвращает объект пользователя, который затем интерпретируется как true

Поэтому я предлагаю следующее:

class ApplicationController 

    before_action :verify_authenticity 

    def verify_authenticity 
     # Your code 
    end 

    def user_signed_in? 
     current_user.is_authenticated? # or whatever 
    end 
    alias :user_logged_in? :user_signed_in? 

class SessionController < ApplicationController 

    skip_before_filter :verify_authenticity 

    def new 
     redirect_to index_url if user_signed_in? 
    end 
+0

Спасибо за вашу помощь, я попробую сейчас. и вы имели в виду «СДЕЛАЙТЕ что-то, если COND» - плохой стиль? я этого не заметил, но я обнаружил, что код выглядит уродливым, хотя он сохраняет слова – newBike

+0

Nono, 'Сделайте что-нибудь, если cond' совсем не плохой стиль, я сам его использую. Напротив, я считаю, что это то, что вы можете сделать только в Ruby, и поэтому так естественно писать это так иногда. По крайней мере, имея дело с очень короткими/простыми условиями, и он может вписываться в одну строку, например 'redirect_to index_url, если user_signed_in?'. –

Смежные вопросы