1. Welcome
  2. Getting Started [+/-]
    1. Installing from RubyGems
    2. Installing from GitHub.com
    3. Installing with Sake
  3. The Basics [+/-]
    1. Hello World
      1. Application Generation Options
    2. Paths
    3. Environments
    4. Rake
  4. Configuration [+/-]
    1. Configatron
    2. Initializers
      1. Gems
      2. Mime-Types
  5. Routing [+/-]
    1. Default Routes
    2. Named Routes
    3. RESTful/Resource Routes
    4. Nested Resource Routes
    5. Regex Routes
    6. Wildcard Routes
    7. Blocks in Routes
    8. Redirecting
    9. Error Handling
    10. Deferred? Routes
    11. Misc. Routing
  6. Controllers [+/-]
    1. Actions
    2. Headers/Status
    3. Handling Content Types
    4. Filters
    5. Helpers
    6. Layouts
    7. Tell Messaging
    8. Redirecting
    9. Rendering
      1. Engines
        1. Erubis
        2. XML Builder
        3. Extending
          1. Case Study: PDF Writer
      2. Types
        1. :action
        2. :text
        3. :inline
        4. :xml
        5. :url
        6. :partial
        7. :template
        8. :public
        9. Extending
          1. Case Study: PDF Writer
  7. Views [+/-]
    1. Helpers
    2. Layouts
    3. Assets Host
    4. Assets Management
    5. Form Builders
  8. Sessions [+/-]
    1. Session Store API
  9. Request/Response [+/-]
    1. Cookies
  10. Testing [+/-]
    1. RSpec
    2. Test::Unit::TestCase
  11. Porlets [+/-]
    1. Developing
    2. Testing
    3. Packaging
    4. Using
  12. Plugins [+/-]
    1. Extending
      1. Case Study: PDF Writer
  13. Deploying [+/-]
    1. Thin
    2. Passenger (mod_rails)
    3. Joyent Accelerator
  14. Mack More [+/-]
    1. mack-active_record
    2. mack-asset_packager
    3. mack-caching
    4. mack-data_factory
    5. mack-data_mapper
    6. mack-distributed
    7. mack-encryption
    8. mack-facets
    9. mack-haml
    10. mack-javascript
    11. mack-localization
    12. mack-markaby
    13. mack-notifier
    14. mack-orm
    15. mack-pdf_writer
  15. Rails to Mack Cheat Sheet
  16. Contributing
  17. APIs [+/-]

Session Store API

Writing a custom session store for Mack is pretty simple. Let's build a simple store that uses the file system to persist the sessions. There are four class level methods that need to be implemented and the Mack::SessionStore::Base class needs to be extended.

module Mack
  module SessionStore
    class MyCustomFileStore < Mack::SessionStore::Base

      class << self

        # Returns the Mack::Session object if the session file exists.
        # If it does not exist return nil.
        def get(id, request, response, cookies)
          session_file = Mack::Paths.tmp('sessions', id)
          if File.exists?(session_file)
            return Marshal.load(File.read(session_file))
          end
          return nil
        end

        # Save the session to disk.
        def set(id, request, response, cookies)
          session_file = Mack::Paths.tmp('sessions', id)
          FileUtils.mkdir_p(Mack::Paths.tmp('sessions'))
          File.open(session_file, 'w') {|f| f.puts Marshal.dump(request.session)}
        end

        # Expire the session by deleting the session file.
        def expire(id, request, response, cookies)
          FileUtils.rm_rf(Mack::Paths.tmp('sessions', id))
        end

        # Delete all the sessions from disk.
        def expire_all(request, response, cookies)
          FileUtils.rm_rf(Mack::Paths.tmp('sessions'))
        end

      end

    end # MyCustomFileStore
  end # SessionStore
end # Mack

Now all the needs to be done is tell Mack to use this session store. This can be done with a configuration setting like this:

configatron.mack.session_store = :my_custom_file_store

Please note that although this example does actually work, it hasn't be tested thoroughly, so if you use it, please understand that there might be issues. For example, there is no code in this example that expires a session after a certain time, nor is the file encrypted, which it probably should be.

This guide was written for Mack version 0.8.2