Подтвердить что ты не робот

Rails 3: сохранение сеанса в активной записи (не cookie)

Я около часа гулял с университетом Google, но по этой теме нет ни одной хорошей документации :-( Надеюсь, кто-то может помочь. Я готов купить книгу так же долго, как кто-нибудь может сказать мне, какая из них.

Я использую следующие версии:

  • рельсы 3.2.6,
  • ruby 1.9.3p194 (2012-04-20 редакция 35410) [x86_64-darwin11.4.0]

Чтобы начать использовать хранилище сессий в Active Record вместо cookie, я сделал следующее:

  1. Обновите 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
    
  2. rake db:sessions:create

    invoke  active_record
      create    db/migrate/20120729025112_add_sessions_table.rb
    
  3. 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) ======================================
    
  4. Чтобы узнать, какая таблица на самом деле создана, я открываю файл 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" таблицы как массив.

Большое спасибо за помощь!

4b9b3361

Ответ 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 данных в сеансе?)