Rails 3: сохранение сеанса в активной записи (не cookie)
Я около часа гулял с университетом Google, но по этой теме нет ни одной хорошей документации :-( Надеюсь, кто-то может помочь. Я готов купить книгу так же долго, как кто-нибудь может сказать мне, какая из них.
Я использую следующие версии:
- рельсы 3.2.6,
- ruby 1.9.3p194 (2012-04-20 редакция 35410) [x86_64-darwin11.4.0]
Чтобы начать использовать хранилище сессий в Active Record вместо cookie, я сделал следующее:
-
Обновите config/initializers/session_store.rb
. Прокомментировал первую строку и оставил комментарий к последней, поэтому у меня есть:
# Be sure to restart your server when you modify this file.
# Myapp::Application.config.session_store :cookie_store, key: '_elegato_session'
# Use the database for sessions instead of the cookie-based default,
# which shouldn't be used to store highly confidential information
# (create the session table with "rails generate session_migration")
Myapp::Application.config.session_store :active_record_store
-
rake db:sessions:create
invoke active_record
create db/migrate/20120729025112_add_sessions_table.rb
-
rake db:migrate
== CreateLinkedinUsers: migrating ============================================
-- create_table(:linkedin_users)
-> 0.0236s
== CreateLinkedinUsers: migrated (0.0237s) ===================================
== AddSessionsTable: migrating ===============================================
-- create_table(:sessions)
-> 0.0012s
-- add_index(:sessions, :session_id)
-> 0.0006s
-- add_index(:sessions, :updated_at)
-> 0.0006s
== AddSessionsTable: migrated (0.0026s) ======================================
-
Чтобы узнать, какая таблица на самом деле создана, я открываю файл sqlite3
sqlite> .schema sessions
CREATE TABLE "sessions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "session_id" varchar(255) NOT NULL, "data" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
CREATE INDEX "index_sessions_on_session_id" ON "sessions" ("session_id");
CREATE INDEX "index_sessions_on_updated_at" ON "sessions" ("updated_at");
Итак, в таблице сеансов есть поле "данные", в котором будет храниться все, что связано с сеансом.
Теперь на мой вопрос :-)
Мне нужно хранить значения для 2 переменных в сеансе: access_token и request_token. Могу ли я использовать следующие? (как я использовал для хранения значений сеанса для куки)
session[:access_token] = <blah>
session[:request_token] = <some other blah?
И если это работает, ruby сохраняет обе переменные в поле "data" таблицы как массив.
Большое спасибо за помощь!
Ответы
Ответ 1
Все ваши переменные сеанса сериализуются с использованием Base64 в столбце данных таблицы сеансов. Вы можете использовать его так же, как если бы вы его использовали, если бы вы назначали и извлекали значения, используя хранилище сеансов cookie. Есть несколько хороших преимуществ для хранения переменных сеанса в db, например, только передача session_id во время каждого запроса, а не весь сеанс из файла cookie, возможность управлять устаревшими или старыми сеансами, проверяя их возраст (created_at/updated_at) и возможность хранить больше информации, чем вы можете в файле cookie.
Вы также можете предоставить свой собственный класс Session, проверьте документацию в классе SessionStore: https://github.com/rails/rails/blob/5edfc463484827df364a1e589677d5c84dfac282/activerecord/lib/active_record/session_store.rb
Ответ 2
Вам вообще не нужно слишком много заботиться о том, как Rails хранит сеансы, прозрачно. Если вы используете хранилище cookie или хранилище ActiveRecord, ваш код не изменится.
Итак, вы можете делать то, что делали раньше. И технически сериализованная строка, содержащая сеанс, хранится в поле data
, но это не имеет большого значения:)
Однако я бы предложил использовать хранилище cookie, если у вас нет веских причин использовать ActiveRecord (более 4K данных в сеансе?)