Skip to content

Session Reset undefined method `destroy' for {}:Hash #852

@lighthouse-import

Description

@lighthouse-import

Imported from Lighthouse. Original ticket at: http://rails.lighthouseapp.com/projects/8994/tickets/6440
Created by Bruno Pinto - 2011-02-16 02:52:57 UTC

After upgrading Rails to version 2.3.11 I started receiving this error after calling reset_session:

 Backtrace:

  /home/deploy/apps/gems_bundler/ruby/1.8/gems/actionpack-2.3.11/lib/action_controller/request.rb:449:in 'reset_session'
  /home/deploy/apps/gems_bundler/ruby/1.8/gems/actionpack-2.3.11/lib/action_controller/base.rb:1244:in 'reset_session_without_flash'
  /home/deploy/apps/gems_bundler/ruby/1.8/gems/actionpack-2.3.11/lib/action_controller/flash.rb:159:in 'reset_session'

My first reaction was to google for a solution when I couldn't I came here and looked for related tickets and I manage to find this one:

https://rails.lighthouseapp.com/projects/8994/tickets/4938-patch-session-fixes-sessions-should-not-be-created-until-written-to-and-session-data-should-be-destroyed-on-session-reset

I was digging (read: trying to) for the answer and perharps for an acceptable patch but I couldn't. This was the best I could do (correct me if I'm wrong):

At first, sessions were created on each request but it was harming performance so they decided to lazy it and then ActionController::Session::AbstractStore::SessionHash was created. It extends the normal Hash class but it's extended with some methods including 'destroy' which is responsible for the error I am receiving.

For a reason I don't know, when a request is created or reseted, it's content is an empty normal Hash. It's only changed to a SessionHash farther when the method call is called from an AbstractStore instance.
I don't know why the creation still sets a normal hash to the session variable and not a SessionHash however I made a 'patch' without breaking tests and without changing this behavior.

./actionpack/lib/action_controller/session/abstract_store.rb (original):

  def session
    @env['rack.session'] ||= {}
  end

  def reset_session
    session.destroy if session
    self.session = {}
  end
./actionpack/lib/action_controller/session/abstract_store.rb (patch?):

  def session
    @env['rack.session'] ||= {}
  end

  def reset_session
    session.destroy if session && session.is_a?(ActionController::Session::AbstractStore::SessionHash)
    self.session = {}
  end

Hope it helps, and please correct me when I'm wrong.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions