Сессия Rails нуждается в "осмотре", чтобы быть вызванным - PullRequest
0 голосов
/ 18 ноября 2009

Я использую сеанс Rails для хранения cookie_jar, полученного из Mechanize. Это позволяет мне вызывать веб-сервис и поддерживать файлы cookie, которые он отправляет обратно.

Класс занимает сеанс в своем конструкторе, поэтому я передаю сеанс Rails. Затем, когда я вызываю сервис, я загружаю cookie_jar (если он у меня есть), например:

agent =  WWW::Mechanize.new
agent.cookie_jar = YAML.load(@session[COOKIE_JAR]) if @session.has_key? COOKIE_JAR

Как только я закончу звонить, я снова сохраню cookie_jar как:

@session[COOKIE_JAR] = agent.cookie_jar.to_yaml

Хотя я хотел бы просто сохранить «агент», его нельзя сериализовать (и, следовательно, нельзя включить в сеанс). Вот интересная часть: если я вызываю "session.inspect" в конструкторе классов (или в любое время, прежде чем проверять, есть ли у сеанса ключ, который я ищу), все работает нормально. Удалите вызов "session.inspect", и он больше не работает.

Кто-нибудь знает, почему сеанс Rails ведет себя таким образом?

1 Ответ

3 голосов
/ 18 ноября 2009

Попробуйте что-то вроде этого:

cj = @session[COOKIE_JAR]
agent.cookie_jar = YAML.load(cj) unless cj.nil?

Возможно, вы победили некоторую магию метапрограммирования рельсов, не настаивая на том, чтобы она выдавала вам настоящую строку. Сеансы - это хеш-подобные объекты, но на самом деле они не являются хешами.

Обновление: просмотр документов API с исходным кодом - это не метапрограммирование, а простая логика:

    # File actionpack/lib/action_controller/session/abstract_store.rb, line 27
27:         def [](key)
28:           load! unless @loaded
29:           super
30:         end

SessionHash является производным от Hash, но только несколько методов получают ленивую оболочку загрузки, и has_key? не является одним из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...