Почему моя переменная класса переинициализируется с помощью cattr_accessor (JRuby, Rails) - PullRequest
4 голосов
/ 25 февраля 2011

Хорошо, я знаю, что это немного откровенно, но я использую JRuby на Rails, и я относительно новичок в обоих.Я вижу поведение, которое я не могу понять, и я хотел бы знать, делаю ли я что-то неправильно или это проблема с моим стеком.Основная проблема заключается в том, что кажется, что мои атрибуты класса переинициализируются, чего я не ожидал бы.

Вот мой код

class MyController < ActionController::Base
  cattr_accessor :an_attr
  before_filter :init_an_attr

  def init_an_attr
    if @@an_attr.nil? 
      @@an_attr = {}
    end
    # do some other stuff here
  end
end

Проблема заключается втот факт, что каждый раз, когда вызывается init_an_attr, условие if оценивается как true, и я в конечном итоге переназначаю @@ an_attr.

Это ожидаемое поведение?Если да, то можете ли вы объяснить, почему, потому что для меня назначение должно произойти только один раз.

1 Ответ

3 голосов
/ 25 февраля 2011

В Rails при работе в режиме разработки классы не кэшируются.MyController и все остальные классы перезагружаются при каждом запросе.При работе в рабочей среде это не так - классы кэшируются.

Однако даже в рабочей среде эта переменная будет локальной для конкретного экземпляра приложения - например, если вы работаете с двумя Mongrelsу каждого будет своя версия этой переменной.

Если вы хотите, чтобы состояние устанавливалось для нескольких запросов, рассмотрите возможность использования сеанса или сохранения значений в вашей базе данных.Переменные класса действительно не подходят для хранения перекрестных запросов.

...