Подтверждение при развертывании Apache Passenger: сеанс доступа к рельсам в модели

Я использую это для доступа к сеансу в модели.

http://www.zorched.net/2007/05/29/making-session-data-available-to-models-in-ruby-on-rails/

Кто-нибудь может подтвердить, что он будет работать и с развертыванием Apache + Passenger?

Или, если есть другие альтернативы для достижения того же?

Спасибо,

Имран

Ответ 1

Да. Это единственный эффективный способ использования данных сеанса в модели. Я также использовал его и никогда не сталкивался с проблемой развертывания с пассажиром Apache +.

Но вам нужно подтвердить, когда будете играть со значениями сеанса. При каждом новом запросе на сервер значение сеанса сохраняется в потоке, и мы можем получить к нему доступ в модели. Если вы применяете какую-либо логику, используя значение потока, то также убедитесь в ситуации, когда значение потока также может быть равно нулю.

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

Ответ 2

Я не нашел никакого кода в Интернете, который работает, поэтому я сделал некоторые исследования и написал свои собственные. Он работает для Rails 3.2.x и, возможно, в некоторых других версиях.

Вставьте это в свой ApplicationController

  # Set a filter that is invoked on every request
  before_filter :_set_current_session

  protected
  def _set_current_session
    # Define an accessor. The session is always in the current controller
    # instance in @_request.session. So we need a way to access this in
    # our model
    accessor = instance_variable_get(:@_request)

    # This defines a method session in ActiveRecord::Base. If your model
    # inherits from another Base Class (when using MongoMapper or similar),
    # insert the class here.
    ActiveRecord::Base.send(:define_method, "session", proc {accessor.session})
  end

Я не буду напоминать вам, что доступ к вашей сессии из модели может привести к неправильному коду. Другие сообщения могут вам сказать, что вы глупые. Хотя есть некоторые веские причины для доступа к сеансу из вашей модели, например, реализация метода Model.save, который сохраняется в текущем сеансе пользователей.