我已经深入地研究了代码(阅读:随机地反复阅读),最后我把范围缩小到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会话中发生了什么变化,我如何使它工作?