代码之家  ›  专栏  ›  技术社区  ›  Taryn East

如何在ActiveRecord::SessionStore中将Rails2.0.2升级到2.3.5(甚至2.1.0)=>之后修复堆栈溢出

  •  0
  • Taryn East  · 技术社区  · 16 年前

    我已经深入地研究了代码(阅读:随机地反复阅读),最后我把范围缩小到ActiveRecord::Session store。

    当我启动脚本/控制台时,我可以用以下行复制堆栈溢出:

    s = ActiveRecord::SessionStore::Session.new(:session_id => '42', :data => {})
    

    要跟踪的堆栈跟踪。

    为了确保它不是某种奇怪的不兼容,我在db中去掉了session表,并使用rakedb:sessions:create重新加载了它,它仍然在那一行上。

    SystemStackError: stack level too deep
    from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/schema_definitions.rb:68:in `type_cast'
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:161:in `field_changed?'
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:132:in `write_attribute_without_dirty'
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/dirty.rb:139:in `write_attribute'
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/attribute_methods.rb:211:in `session_id='
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2746:in `send'
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2746:in `attributes='
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2742:in `each'
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2742:in `attributes='
     from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:2438:in `initialize'
     from (irb):10:in `new'
    

    我进入活动的记录,并把放在一堆线。这里有一个简短的版本,最后两行不断重复,显然是堆栈溢出。。。但为什么列\u for \u属性(session \u id)会导致溢出?

    "in respond_to? method: session_id="
    "in respond_to? session_id= - there are no generated methods. generating..."
    "in respond_to? session_id= - methods generated"
    "responds to session_id=? y"
    "in respond_to? method: session_id="
    "in respond_to? session_id= - super is true"
    "in read_attribute: session_id about to fetch value"
    "fetched attr value: nil"
    "read attr: session_id - value nil"
    "column for attribute: session_id"
    "c_for_a got col hash - accessing for name: session_id"
    "column for attribute: session_id"
    "c_for_a got col hash - accessing for name: session_id"
    "column for attribute: session_id"
    "c_for_a got col hash - accessing for name: session_id"
    "column for attribute: session_id"
    "c_for_a got col hash - accessing for name: session_id"
    

    注意:我们也尝试升级到2.1.0版本,同样的错误也发生了(当尝试登录时-显然会话类在两个版本之间更改了名称,所以scit/console问题取决于类名)。这一次,它无休止地尝试只使用“id”而不是“session\u id”。

    当前environment.rb会话设置(对于2.1.0版本)如下:

    # Use the database for sessions instead of the file system
    # (create the session table with 'rake db:sessions:create')
    config.action_controller.session_store = :active_record_store
    config.action_controller.session = { :session_key => "_our_session_id",
        :secret=> "some random secret key of your choosing over 30 characters" } 
    

    所以我想问题是:在v2.0.2和2.1.0之间的ActiveRecord会话中发生了什么变化,我如何使它工作?

    1 回复  |  直到 12 年前
        1
  •  1
  •   Taryn East    16 年前

    好的,看起来问题是一个旧的后端口/猴子补丁。在plugins目录中,我们有一个“dirty”功能的后端口——我猜它一定是在rails2.1.0中出现的。我所知道的是,删除插件似乎已经使“堆栈级别太深”的问题消失了(目前)