Совместное использование сеанса Rails с другими приложениями, использующими хранилище сеансов БД - PullRequest
2 голосов
/ 10 февраля 2012

Devise gem используется для аутентификации.

Сессии Rails хранятся в базе данных .

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

Когда пользователь войдет в систему, я должен обновить столбец 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 Ответ

1 голос
/ 11 февраля 2012

Хосе Валим (из Devise) ответил:

Начиная с Rails 3.1, Warden устанавливает параметр: renew при входе пользователя, заставляя старый сеанс быть уничтоженным и создавая новый.

Итак, в итоге я создал 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 кэширует запросы к БД, не будет никакого реального вызова SQL для получения сеанса изsessions таблица.Это уже в памяти.То же самое относится и к обновлениям.Rails обновит user_id только в первый раз.В остальное время UPDATE запрос не поступит в СУБД.

...