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
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 
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