Подтверждение при развертывании 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
, который сохраняется в текущем сеансе пользователей.