Rails 7 ActiveRecord::SessionStore – как получить идентификатор базы данных текущего сеанса в контроллере?

Я использую Rails 7.1.3.2 и только что установил activerecord-session_store (2.1.0).

https://github.com/rails/activerecord-session_store

Все работает — значения сеанса, которые я установил в контроллере, сохраняются в записи сеанса в базе данных. Однако я также хочу установить поле account_id в записи сеанса в базе данных, чтобы я мог получить самую последнюю запись сеанса для записи учетной записи в моем тестовом сценарии.

Как я могу это установить? Я не могу понять, как получить запись модели сеанса в контроллере.

В документации (ссылка выше) говорится: «Однако вы должны установить session.model.id = session.session_id вручную! Фильтр перед ApplicationController — хорошее место».

Но если я вызову session.model в контроллере, я получу это исключение:

undefined method `model' for an instance of ActionDispatch::Request::Session

Если я вызову session.id, я получу буквенно-цифровую строку, которая является значением файла cookie сеанса, но отличается от значения, хранящегося в поле id и поле session_id в базе данных.

Все, что мне на самом деле нужно сделать, это получить идентификатор базы данных текущей записи сеанса, а затем я мог бы обновить поле account_id с помощью sql-запроса. Кто-нибудь знает, как я могу получить доступ к фактической записи модели?

🤔 А знаете ли вы, что...
Ruby on Rails предоставляет множество готовых решений для обработки типичных задач, таких как маршрутизация и работа с базой данных.


1
165
1

Ответ:

Решено

Глядя на код, я не понимаю, когда session.model можно было сделать, возможно, когда этот драгоценный камень был частью Rails v3. Лучшее, что я 🔁 понял , это использовать модель сеанса напрямую:

ActiveRecord::SessionStore::Session.find_by_session_id(session.id.private_id)

Еще вот этот кусочек привлек мое внимание:

request.env[SESSION_RECORD_KEY] = session

Однако вам необходимо загрузить сеанс до того, как будет заполнен env:

session.send(:load!)
model = request.env["rack.session.record"]