Una variable global

Hola lista, cómo puedo crear una variable global para poder leerla en
cualquier método de la clase?
Por ejemplo, tengo mi método edit:
def edit
@id=params[:id]
end

Sólo cuando entra en edit, me gustaría que la variable @id se pudiera
acceder a ella en cualquier otro método. Tengo pendiente estudiarme bien
el libro sobry Ruby, pero mientras me pongo a ello me ha surgido esta
duda. Alguien puede ayudarme de cómo puedo hacerlo? gracias

On Nov 19, 2007, at 6:52 PM, Miguel Angel Calleja Lázaro wrote:

el libro sobry Ruby, pero mientras me pongo a ello me ha surgido esta
duda. Alguien puede ayudarme de cómo puedo hacerlo? gracias

Conoces algun lenguaje con orientacion a objetos?

– fxn

Hola Miguel Ángel,

No sé si he entendido bien tu pregunta, así que me he guiado más por tu
ejemplo :wink: Todas las acciones de tu controlador pueden acceder a sus
@variables_de_instancia:

def edit
@id = params[:id]
foo # llamo a otro metodo…
end

def foo

…y desde el puedo usar @id

@user = User.find(@id)
end

Si lo que quieres es crear e inicializar esa variable en todas las
acciones de tu controlador seguramente debas usar un filtro:

class MyController < ApplicationController

con este filtro ejecuto set_id antes de cualquier accion

(he definido set_id mas abajo)

before_filter :set_id

def edit
# aqui ya tienes @id asignado
end

def foo
# aqui tambien, etc…
end

private

es bueno que set_id sea privado para que no sea accesible via URL

def set_id
@id = params[:id]
end

end


Raul M. - Freelance Web D.
http://raul.murciano.net

Raul M.
escribió:

con este filtro ejecuto set_id antes de cualquier accion

private

es bueno que set_id sea privado para que no sea accesible via URL

def set_id
@id = params[:id]
end

end

Aha, no sabía que las variables de instancia eran accesibles en
cualquier método, probaré lo que me dices, gracias por tus consejos

Xavier N.
escribió:

– fxn


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Si claro, pero como en ruby nunca había hecho hasta ahora nada orientado
a objetos no sabía muy bien cómo empezar. Imagino que tengo que crear el
constructor initialize, declarlar ahí la variable de instancia, poder
leerla y escribirla en cualquier otro método, no? La duda que tenía es
sobre los métodos de accesso (attr_accessor), si sirven para leer las
variables de instancia fuera de la clase o tengo que hacer uso de estos
métodos para trabajar en la misma clase. Imagino que lo primero porque
la respuesta de Raúl Marciano me dice que puedo leer las variables de
instancia en cualquier método que no lo sabía.

Perdonad por preguntas tan chorras, es la única manera de aprender :slight_smile:

On Nov 20, 2007, at 9:56 AM, Miguel Angel Calleja Lázaro wrote:

la respuesta de Raúl Marciano me dice que puedo leer las variables de
instancia en cualquier método que no lo sabía.

OK. Ya sabes que necesitas darte un baño de Ruby, asi que te situo
rapido esto partiendo de que sabes orientacion a objetos.

En Ruby las variables de instancia son aquellas cuyo nombre empieza
con una (sola) arroba:

@user

Como en otros lenguajes orientados a objetos las variables de
instancia representan el estado de un objeto y son visibles en todos
sus metodos. Por tanto, como explico Raul, con asignar a @id donde
quieras es suficiente.

A diferencia de otros lenguajes, en Ruby no se declaran las variables
de instancia, ni deben crearse en initialize. Simplemente se crean por
arte de birlibirloque cuando se asigna a ellas:

irb(main):001:0> class Foo; def x; @x = 1; end; end
=> nil
irb(main):002:0> foo = Foo.new
=> #Foo:0x34e3b0
irb(main):003:0> foo.x
=> 1
irb(main):004:0> foo
=> #<Foo:0x34e3b0 @x=1>

Ves que en la ultima (004) aparece “@x” y no aparecia en la primera
(002)?

Los attr_reader and friends crean variables de instancia y generan
setters y getters, no tienen que ver con declaracion de atributos. Son
metodos de Module que metaprograman al ser ejecutados, no son keywords.

Como corolario, en Ruby no tiene sentido preguntar “que atributos
tienen los objetos de tal clase?”. Si tiene sentido preguntar “que
variables de instancia tiene este objeto en este momento?”.

– fxn