Как сохранить сессию в рельсах до окончания запроса?
-
27-10-2019 - |
Вопрос
Я использую Rails 2.3 и Activerecord в качестве сессионного магазина, и я хочу избежать создания сеансов, прежде чем это будет необходимо.
У меня есть таблица ITENS для хранения предметов, связанных с сеансом, то есть у ее модели есть ассоциация belongs_to :session
.
У меня есть звонок Ajax, который должен создать новый элемент. Когда еще нет сеанса, он должен создать один, чтобы быть связанным с элементом. Для этого мне нужен удостоверение личности из таблицы сеансов, а не Session_id, используемый для идентификации Sesssion 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
Решение
«Объекты модели не должны ничего знать о сессии» (Пэт Мэддокс из http://markmail.org/message/4ilmpn7s3wkq6iod).
И это имеет смысл, так как, если я решил сохранить сеанс в памяти, файловых файлах, файловой системы или везде, в коде модели ничего не меняется.
Итак, решение состоит в том, чтобы создать другую таблицу для хранения items_groups. Если еще нет сеанса, создайте новый items_group и сохраните его идентификатор в сеансе. В противном случае, восстановите items_group_id из сеанса, и мы закончили!
Когда сеанс хранится в базе данных больше не имеет значения.