Duda del uso de self y ambito de las variables

Hola lista, tengo una pregunta para hacerles.
Tengo dentro del controlador quiero declarar una variable de instancia
que se llama @usuario, en determinado momento del programa se llama a
una funcion que hace un find a la cual quiero mantener la referencia

class UsuariosController < ApplicationController
@usuario=nil

def validarUsr
codigo
@usuario=Usuario.find(:first, :conditions
=>[“usuario=”+"’"+params[:usr][:nombreusuario]+"’"+" and
"“password=”+params[:usr][:pass]])
codigo
end
mas metodos
end

El problema que tengo es que durante la funcion validarUsr si tengo
referencia al objeto, pero cuando sale pierdo la referencia quedando
@usuario en null, probe hacer un self.@usuario, self.usuario, pero me lo
toma como error. quisiera saber como puedo hacer referencia al @usuario
del objeto ya que supongo que esta creando una variable @usuario local.
desde ya muchas gracias

PD: La busqueda ya comprobe que devuelve un objeto y no es nil.

Para que la variable sea visible desde todos los metodos de la clase es
@@usuario, la variable @usuario es solo visible desde el metodo
validarUsr.

saludos,
Juan P…

gracias por responder, ahora me queda una duda, las variables con de la
forma @@usuario no son variables de clase? osea, una variable compartida
para todos los objetos de una misma clase?
seria un problema que otra instancia de esa clase me cambie el valor.

Horacio B. wrote:

Tengo dentro del controlador quiero declarar una variable de instancia
que se llama @usuario, en determinado momento del programa se llama a
una funcion que hace un find a la cual quiero mantener la referencia
(…)

El problema que tengo es que durante la funcion validarUsr si tengo
referencia al objeto, pero cuando sale pierdo la referencia quedando
@usuario en null, probe hacer un self.@usuario, self.usuario, pero me lo
toma como error. quisiera saber como puedo hacer referencia al @usuario
del objeto ya que supongo que esta creando una variable @usuario local.
desde ya muchas gracias

La cuestión aquí es: ¿para qué quieres guardar la referencia a la
variable @usuario? Lo normal en el tratamiento habitual de una petición
es que se ejecute un única acción del controlador. Las variables
establecidas en esa acción serán visibles sólo desde las vistas RHTML
que especifique el controlador. No es habitual tneer que compartir
variables o datos entre diferentes acciones del controlador, porque se
corresponderán -por lo general, ya digo- con diferntes peticiones HTTP.
Si quieres tener algún tipo de persistencia entre difernetes peticiones,
tendrás que almacenar los datos en la sesión.

No sé si esto te aclara algo o te confunde más.

On Sep 29, 2007, at 9:56 PM, Horacio B. wrote:

Hola lista, tengo una pregunta para hacerles.
Tengo dentro del controlador quiero declarar una variable de instancia
que se llama @usuario, en determinado momento del programa se llama a
una funcion que hace un find a la cual quiero mantener la referencia

class UsuariosController < ApplicationController
@usuario=nil

Esto no lo hagas. Quiza estes como intentando “declarar” los
atributos del objeto, no se. El caso es que al estar en top-level
estas creando ahi una variable de instancia de la clase misma, que
posiblemente no sea lo que quieres hacer. Esto es, las clases en Ruby
son objetos, y tienen sus propias variables de instancia que se puede
crear ahi, del mismo modo que uno hace regularmente con variables de
instancia dentro de metodos de instancia.

A efectos de uso las variables de instancia de clases se comportan
parecido (ver diferencias en post de abajo) a las variables de clase
(@@) y de hecho hay quienes las prefieren:

http://sporkmonger.com/2007/2/19/instance-variables-class-
variables-and-inheritance-in-ruby

De todos modos, aunque esa linea la quitariamos por lo que te explico
arriba, puede que no tenga que ver con lo que explicas porque las
variables de instancia de la clase y las de las instancias de la
clase no colisionan.

El problema que tengo es que durante la funcion validarUsr si tengo
referencia al objeto, pero cuando sale pierdo la referencia quedando
@usuario en null, probe hacer un self.@usuario, self.usuario, pero
me lo
toma como error. quisiera saber como puedo hacer referencia al
@usuario
del objeto ya que supongo que esta creando una variable @usuario
local.
desde ya muchas gracias

Si en ese metodo @usuario queda con un usuario, todos los metodos de
instancia lo veran en @usuario normal como quien hace @usuario = 1.
Si solo hay metodos de instancia involucrados entonces hay un bug,
una errata, …

– fxn

Chicos muchas gracias por la ayuda, no sabia que cada vez que la vista
hace una peticion al controlador, se crea una nueva instancia del mismo,
eso me aclara un par de dudas, y ahora voy a probar lo de las sesiones,
muchas gracias a todos :slight_smile:

me andubo perfecto lo de la session muchas gracias :), y ahi lei lo del
dispacher ahora se me aclararon varias cosas gracias :wink:

Hola lista, tengo una pregunta para hacerles.
Tengo dentro del controlador quiero declarar una variable de instancia
que se llama @usuario, en determinado momento del programa se llama a
una funcion que hace un find a la cual quiero mantener la referencia

Cada vez que haces una llamada a un controlador, rails crea una nueva
instancia del controlador. En este caso, creara una nueva instancia
del UsuarioController, por le que cada uno tendra su propia instancia
de @usuario, que sera obviamente nil.

Si quieres saber mas sobre este tema : RAILS_HOME/lib/dispatcher.rb,
empezando por el metodo dispatch

El problema que tengo es que durante la funcion validarUsr si tengo
referencia al objeto, pero cuando sale pierdo la referencia quedando
@usuario en null, probe hacer un self.@usuario, self.usuario, pero me lo
toma como error. quisiera saber como puedo hacer referencia al @usuario
del objeto ya que supongo que esta creando una variable @usuario local.
desde ya muchas gracias

Por lo que te he explicado mas arriba no puedes. Podrias si declararas
@@usuario, pero eso es una mala practica, IMHO. Seria mejor que
explicases para que quieres esa referencia y por que no la puedes
obtener desde un param, para que otros te ayudasen.

Pedro Del G.

Email : [email protected]

Trata con $usuario