Ruby on Rails: variable de controlador de acceso del modelo

Estoy intentando acceder a una variable de instancia que está configurada en el controlador en el modelo. El controlador es el controlador de productos y el modelo es el modelo de productos. La variable de instancia es una instancia de otro modelo llamado cuenta.

La variable de instancia es @current_account

Cuando ejecuto el código no ocurre nada, no obtengo un error. ¿Alguien sabe dónde puedo encontrar algo leído sobre variables de instancias de acceso establecidas en el controlador desde el modelo?

Gracias

Eef

Por lo general, no debe intentar acceder al controlador desde el modelo en busca de problemas que no abordaré.

Resolví un problema similar como ese:

 class Account < ActiveRecord::Base cattr_accessor :current end class ApplicationController < ActionController::Base before_filter :set_current_account def set_current_account # set @current_account from session data here Account.current = @current_account end end 

Entonces simplemente acceda a la cuenta actual con Account.current

DESCARGO DE RESPONSABILIDAD: El siguiente código rompe las convenciones de MVC, eso dijo …

El uso de atributos de clase probablemente puede conducir a problemas de seguridad de subprocesos. Yo usaría Thread.current + around_filter para almacenar los datos relacionados con el controlador a nivel de subproceso y me aseguraré de que se borren justo antes de que finalice la solicitud:

 class ApplicationController < ActionController::Base around_filter :wrap_with_hack def wrap_with_hack # We could do this (greener solution): # http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/ # ... but for simplicity sake: Thread.current[:controller] = self begin yield ensure # Prevent cross request access if thread is reused later Thread.current[:controller] = nil end end end 

Ahora la instancia actual del controlador estará disponible globalmente durante el procesamiento de la solicitud a través de Thread.current [: controller]

Si necesita acceder a una variable de controlador desde un modelo, generalmente significa que su diseño es incorrecto porque un controlador sirve de puente entre la vista y el modelo (al menos en Rails), el controlador obtiene información de los modelos, los modelos no deberían saber nada sobre los controladores, pero si quieres hacerlo de todos modos, puedes hacerlo tal como lo dijo Jeem, pero prefiero:

  class << self attr_accessor :current end 

en lugar de

  cattr_accessor: actual 

se puede ver por qué aquí => cattr_accessor no funciona como debería

No puedo comentar directamente, así que publicaré aquí: la respuesta aceptada no parece ser la correcta. Como notas @vise, las variables de clase se comparten entre las solicitudes. Entonces, a menos que haya solo una cuenta actual para toda la aplicación, esto no se comportará como se espera.

Para obtener más información, consulte la respuesta aceptada por @molf aquí: ¿Se comparte Rails, nada o las solicitudes separadas pueden acceder a las mismas variables de tiempo de ejecución?

No estoy seguro si entiendo la pregunta exactamente, pero daré una puñalada.

Creo que si necesitas acceder a una variable de instancia del controlador desde el modelo, entonces debes convertirlo en un atributo en el modelo o mover tu lógica al otro controlador de clase, no al modelo.

    Intereting Posts