2013-02-28 3 views
0

Если вы наблюдаете за любым Ryan Bates Authentication, связанным с Railscasts, вы увидите повторяющуюся тему при создании функциональных возможностей sigin/signout, и я хотел бы понять это немного более четко.Сессионные сессии Помощники в Rails

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

Например, как правило, в контроллере сессии создать действие будет содержать присвоение сессий хэш, такие как session[:user_id] = user.id при условии, что переменная пользователя установлена ​​в активной записи объекта.

Вышеуказанный вспомогательный метод затем используется во всех представлениях для поиска текущего подписанного пользователя.

Однако при подписании из разрушающего действия содержит только линию session[:user_id] = nil

Мой вопрос будет не @current_user также необходимо установить на ноль, так как он будет установлен на предыдущий пользователь, который был подписан в?

ответ

1

Обычно после установки session[:user_id] = nil ваш контроллер вернется так, что @current_user все еще активен, не имеет значения. Вы должны помнить, что @current_user существует только для этого запроса, следующий запрос, который приходит, является новым экземпляром этого класса контроллера.

Вы правы, что если вы сделали что-то вроде этого:

def destroy 
    session[:user_id] = nil 
    logger.debug current_user.inspect # Current user is still set for this request 
    redirect_to admin_url, notice => "You've successfully logged out." 
end 

Вы увидите информацию о пользователе в файле журнала, но обычно вы делаете редирект сразу после очистки сессии [: user_id] так этот экземпляр контроллера выполнен.

+0

K спасибо! Имеет смысл. Поэтому, как только страница перенаправляется при следующем запросе, «@ current_user» загружается снова, но вместо него, содержащего user_id для ранее подписанного пользователя, по существу '@current_user = nil || User.find (session [: user_id]), если session [: user_id]? ' – rssathe

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