рельсы 3 - где положить вещи инициализации запуска приложения? - PullRequest
1 голос
/ 10 марта 2011

В моем приложении (jruby, rails 3, mongodb) я настраиваю свои объекты доступа к данным (и другие «синглеты») в инициализаторе /config/initializers/app_constants.rb

DATA_COLLECTION_STORE = DataCollectionStore.new(...)

SOME_OTHER_SINGLETON = SomeOtherClassTreatedLikeSingleton.new(...)

I'mновичок в рельсах (и рубине), и я понимаю пару вещей.Во-первых, установка этих «синглетонов» не должна быть правильным подходом, так как эти классы могут быть созданы в любое время в любом месте кода (сейчас предполагается, что этого не произойдет).Во-вторых, размещение этих «констант» в этом инициализаторе кажется неправильным, когда я пытаюсь запустить тесты (rake spec) или построить WAR (используя warble). Я вижу, что инициализатор работает, поэтому я создаю соединения с mongo., начиная мой "some_other_singleton" и т. д.

Куда должны идти подобные вещи?

Заранее благодарим за терпение в связи с моей нелюбовью:)

1 Ответ

2 голосов
/ 10 марта 2011

Вам не нужно фактически инициализировать ваши синглтоны в любом конфигурационном файле.Вместо этого вы можете просто реализовать метод класса в вашем классе, который будет возвращать синглтон.Следующий код позволит вам получить доступ к одиночному файлу с помощью DataCollectionStore.instance

class DataCollectionStore
  @@instance = DataCollectionStore.new

  def self.instance
    @@instance
  end

  def initialize
    #intitialize you instance here
  end

end

Имейте в виду, что для config.cache_classes вам нужно будет установить значение true в development.rb, чтобы это работало в вашей среде разработки.Классы по умолчанию кэшируются в производстве.

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

Если ваша инициализация дорогая, вы можете сделать это лениво, используя приведенный ниже фрагмент кода.Таким образом, вы платите цену только в том случае, если ваш тест на самом деле вызывает метод класса экземпляра.Вы можете проверить это в своем приложении, выдав DataCollectionStore.instance в виде и используя различные браузеры для загрузки страницы.Если все работает правильно, вы должны увидеть одинаковую метку времени в обоих браузерах.

class DataCollectionStore
  @@instance = nil

  def self.instance
    @@instance || @@instance = self.new
  end

  def initialize
    @initialized_time = Time.now
  end

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