Как сохранить сессию в Rails до конца запроса? - PullRequest
1 голос
/ 03 декабря 2011

Я использую Rails 2.3 и ActiveRecord в качестве хранилища сессий, и я хочу избежать создания сессий до того, как это потребуется.

У меня есть таблица Itens для хранения элементов, связанных с сессией, т. Е. Ее модель имеетассоциация belongs_to :session.

У меня есть вызов Ajax, который должен создать новый элемент.Когда сеанса еще нет, он должен создать тот, который будет связан с элементом.Для этого мне нужен идентификатор из таблицы сессий, а не идентификатор_ сеанса, используемый для идентификации сеанса с помощью cookie.Но запись сеанса создается в БД только после завершения запроса.Пример:

def create
  request.session_options[:id] # nil if there is no session yet
  session[:activate] = 1 # this "creates" the sesssion (but not in DB)
  request.session_options[:id] # now the new generated session_id
  db_session = Session.find_by_session_id(request.session_options[:id]) # nil, not in DB yet :(
  Item.new(
    :session_id => db_session.id, # ops, id called for nil object
    :data => params[:data]
  )
end

1 Ответ

0 голосов
/ 06 декабря 2011

«Модельные объекты не должны ничего знать о сеансе» (Пэт Мэддокс из http://markmail.org/message/4ilmpn7s3wkq6iod).

И это имеет смысл, поскольку, если я решил сохранить сеанс в памяти, файле cookie, файловой системе или где-либо еще, в коде модели ничего не изменится.

Итак, решение состоит в том, чтобы создать еще одну таблицу для хранения items_groups. Если сеанса еще нет, создайте новую items_group и сохраните его идентификатор в сеансе. В противном случае, извлеките items_group_id из сессии, и все готово!

Когда сеанс хранится в базе данных, больше не имеет значения.

...