[Ror-es] Accediendo a valores de sesión o configuración desde un modelo!

Damian Janowski damian.janowski at gmail.com
Wed Sep 13 18:34:21 GMT 2006


Hola Ariel,

Lo que querés ya está hecho :)

http://www.delynnberry.com/pages/userstamp/

El plugin no lo trae, pero yo agregué algo para facilitarme la
auditoría, que es usar un acts_as en vez de usar el belongs_to en
todos lados (me parece más DRY). Te lo paso:

-- init.rb
require 'acts_as_userstamped'
ActiveRecord::Base.send(:include, ActiveRecord::Acts::Userstamped)

-- lib/acts_as_userstamped.rb
# ActsAsUserstamped

module ActiveRecord
  module Acts #:nodoc:
    module Userstamped #:nodoc:			
      def self.included(base)
        base.extend(ClassMethods)
      end

      module ClassMethods
        def acts_as_userstamped(options = {})
					belongs_to :created_by, :class_name => 'User', :foreign_key => 'created_by'
					belongs_to :updated_by, :class_name => 'User', :foreign_key => 'updated_by'

          # include ActiveRecord::Acts::Contactable::InstanceMethods
          # extend ActiveRecord::Acts::Contactable::SingletonMethods
        end
      end

      module SingletonMethods

      end

      module InstanceMethods
				
      end
    end
  end
end

On 9/12/06, Ariel Fernando Diaz Bermejo <arieldiazbermejo at yahoo.com.ar> wrote:
> Hola estimados co-listeros: tengo una duda que no puedo terminar de resolver
> o mejor dicho, no sé cuál es la manera correcta. En mi aplicación, tengo
> algunos modelos los cuales necesitan acceder a valores de sesión (o mejor
> dicho, a valores de configuraciones que son seteados de manera particular
> para cada usuario que usa la aplicación [de ahí que use session para
> hacerlo]).
> Por ejemplo: en varios de mis modelos, tengo un campo para auditar cuál fue
> el último usuario que modificó el registro. Entonces, en esos modelos
> necesito tener algo así como:
>
> def before_update
>   ......
>   self.last_user_update = session[:user_id]
>   ......
> end
>
> Está de más decir que esto no funciona ya que la variable "session" no está
> disponible dentro del entorno de un modelo. He visto en algunos lugares que
> la solución para estos casos (y la que he implementado actualmente) es crear
> una variable de clase en el modelo que queremos auditar y luego con un
> before_filter en la aplicación, setear esa variable con el valor que desee
> (particularmente el que tengo en session). Esto quedaría algo así como:
>
> <file: railsapp/app/models/asiento.rb>
> class Asiento < ActiveRecord::Base
>     ...
>     def self.current_user=(user)
>        @@current_user = user
>     end
>     ...
>     def before_update
>        ...
>        self.last_user_update = @@curent_user
>        ...
>     end
> end
>
> <file: railsapp/app/controllers/application.rb>
> class ApplicationController < ActionController::Base
>     before_filter :set_current_user
>     ...
>     ...
>     private
>     def set_current_user
>         Asiento.current_user = session[:user_id] || nil
>     end
>     ....
> end
>
> De esta forma queda solucionado y me anda; pero no creo que sea la mejor
> forma ya que tengo que definir una variable de clase con su método "set_" en
> cada modelo que lo necesite y definir tantos filtros como sean necesarios
> para setear dichas variables de configuración. ¿Cómo les parece qué se
> resuelven estos casos?
>
> Otro ejemplo similar que tengo en mi aplicación sería el caso de que para
> contabilizar los movimientos (modelo Asiento) uso una fecha contable que
> puede ser la fecha actual (Time.now) o una fecha_contable definida por el
> usuario que está usando la aplicación. Entonces, del mismo modo que más
> arriba tengo:
>
> <file: railsapp/app/models/asiento.rb>
>  class Asiento < ActiveRecord::Base
>      ...
>      def self.fecha_contable=(fecha)
>         @@fecha_contable = fecha
>     end
>     ...
>      def before_create
>         ...
>         self.fecha = @@fecha_contable
>         ...
>      end
>  end
>
> y,
>
> <file: railsapp/app/controllers/application.rb>
>  class ContableController < ActionController::Base
>      before_filter :set_fecha_contable
>      ...
>      ...
>      private
>      def set_fecha_contable
>          Asiento.fecha_contable = session[:fecha_contable] || Time.now
>      end
>      ....
>  end
>
>
> Perdón por lo extenso del mail y espero me hayan entendido.
> Saludos,
>
> --------------------------------------------------------
> Ariel Diaz Bermejo
> Analista en Cs.de la Computación
> Universidad Nacional de Rio Cuarto
>
>
>  ________________________________
>  Preguntá. Respondé. Descubrí.
>  Todo lo que querías saber, y lo que ni imaginabas,
>  está en Yahoo! Respuestas (Beta).
>  Probalo ya!
>
>
> _______________________________________________
> Ror-es mailing list
> Ror-es at lists.simplelogica.net
> http://lists.simplelogica.net/mailman/listinfo/ror-es
>
>
>


-- 
Damian Janowski
damian.janowski at gmail.com


More information about the Ror-es mailing list