2012-02-09 2 views
2

Утилита devess используется для аутентификации.Совместное использование сеансов рельсов с другими приложениями с использованием хранилища сеансов БД

Рельсы сессии хранятся в базе данных.

Чтобы использовать сеансы вне Rails 3, я создал модель под названием Session. Добавлен стол user_id в таблицу sessions.

Когда пользователь подписывается, я должен обновить столбец user_id в таблице сеансов. Таким образом, в ApplicationController я добавил метод:

protected 
    def after_sign_in_path_for(resource) 
    @session = Session.find_by_session_id(request.session_options[:id]) 
    @session.update_attribute(:user_id, current_user.id) 
    stored_location_for(resource) || root_path if @session.save 
    end 

Но только после того, как переориентировать, в последнее время session разрушается, и я в конечном итоге с другой сессии в БД с пустой user_id.

Какой лучший способ написать user_id один раз при успешном входе в систему?

ответ

1

Хосе Valim (из Завещания) ответил:

Поскольку Rails 3.1, Warden устанавливает: возобновлять вариант, когда пользователь подписывает в, заставляя старую сессию быть разрушенным и создание нового.

Так что я закончил создание update_session фильтра в ApplicationController.

before_filter :update_session 

    protected 
    def update_session 
    if user_signed_in? 
     @session = Session.find_by_session_id(request.session_options[:id]) 
     @session.update_attribute(:user_id, current_user.id) 
    end 
    end 

Поскольку Rails кэширует DB запросов не будет никакого фактического SQL вызова, чтобы получить сеанс из sessions таблицы. Это уже в памяти. То же самое касается обновлений. Rails обновит только user_id. Все остальные запросы UPDATE не будут поступать в СУБД.

+0

Кстати, нет необходимости использовать переменную экземпляра для '@ session'. –

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