2010-11-25 5 views

Respuesta

2

Sí. Es la única forma eficiente que encontré para usar datos de sesión en el modelo. También lo usé y nunca tuve problemas de despliegue con Apache + pasajero.

Pero necesita confirmar cuando jugará con los valores de la sesión. En cada nueva solicitud al servidor, el valor de la sesión se almacena en el hilo y podemos acceder a él en el modelo. Si está aplicando alguna lógica mediante el uso de valor de hilo, también asegúrese de que el valor de la cadena también sea nulo.

Porque me surgió un problema en el desarrollo, todos mis códigos funcionaban bien, pero en la producción, durante el servidor de inicio, causó un problema ya que inicialmente consideraba que el valor del subproceso era nulo.

+0

Gracias Nimsesh. Aquí está el escenario donde necesito acceder a la sesión en Modelo: 1. En ActiveRecord Observer para actualizar un campo - con un valor de sesión - para cada registro. 2. estableciendo un campo de current_user (restful_authentication). ¿Todos los usuarios tendrán el diferente valor que se establece en el inicio de sesión? – Saim

+0

Sí. Solo mira de nuevo aquí http: //www.zorched.net/2007/05/29/making-session-data-available-to-models-in-ruby-on-rails/... Tiene 'before_filter: set_user 'que guarda el valor de la sesión en cada nueva solicitud para enhebrar. Eso significa que cada usuario tiene un valor diferente porque la solicitud de todos es diferente y de esa manera el hilo se mantiene actualizando con diferentes valores –

25

No encontré ningún código en Internet que funciona, así que investigué un poco y escribí el mío. Funciona para Rails 3.2.x y probablemente en algunas otras versiones.

Insertar esto en su 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 

No voy a recordar que el acceso a la sesión de un modelo puede conducir a mal código. Other posts may tell you, that you are stupid. Aunque hay algunas razones válidas para acceder a la sesión desde su modelo, como implementar un método Model.save, eso se guarda en la sesión actual de los usuarios.

+0

Buena técnica. ¡Gracias! – Saim

+0

¿Y cómo puedo probarlo correctamente usando Rspec? Todas mis pruebas para el modelo que estoy usando ahora dicen 'variable local indefinida o sesión de método' –

+0

Buena solución, gracias. –

Cuestiones relacionadas