Хорошо, поэтому мы обновляем устаревший код клиента с 2.0.2 до последних версий. Большинство основ было легко исправить, но я не могу добраться до экранов администратора. Каждый раз, когда мы нажимаем «current_user», мы получаем ошибку «слишком большой уровень стека».
Я глубоко копался в коде (читай: много чего происходило случайным образом) и наконец сузил его до хранилища ActiveRecord :: Session.
Код берется в строке, включающей «session [: user]».
Когда я спулингую скрипт / консоль, я могу повторить переполнение стека следующей строкой:
s = ActiveRecord::SessionStore::Session.new(:session_id => '42', :data => {})
трассировка стека, чтобы следовать.
Чтобы убедиться, что это не какая-то странная несовместимость, я сдул таблицу сеансов в базе данных и перезагрузил ее с помощью rake db: session: 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'
Я вошел в active_record и вставил кучу строк пут. Вот краткая версия: последние две строки постоянно повторяются и явно переполняют стек ... но почему column_for_attribute (session_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, и возникает та же ошибка (при попытке входа в систему - очевидно, что сессионный класс менял имена между ними, поэтому проблема scipt / console зависит от имени класса). На этот раз он бесконечно пытается просто «id» вместо «session_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, он снова заработает.
Таким образом, я предполагаю, что вопрос: что изменилось в сеансе ActiveRecord между v 2.0.2 и 2.1.0 и как я могу заставить его работать?