Как сохранить сессию в Rails до конца запроса?
Я использую 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 ответ
"Объекты модели не должны ничего знать о сеансе" (Пэт Мэддокс из http://markmail.org/message/4ilmpn7s3wkq6iod).
И это имеет смысл, поскольку, если я решил сохранить сеанс в памяти, файле cookie, файловой системе или где-либо еще, в коде модели ничего не изменилось.
Итак, решение состоит в том, чтобы создать еще одну таблицу для хранения items_groups. Если сеанса еще нет, создайте новую items_group и сохраните его идентификатор в сеансе. В противном случае, извлеките items_group_id из сессии, и все готово!
Когда сеанс хранится в базе данных, больше не имеет значения.