Esto sucede debido al alcance. Cuando estás dentro de un método y se intenta establecer una nueva variable de la siguiente manera:
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
end
end
Usted está creando una nueva variable marca que vive en el interior de set_active_flag. Tan pronto como se ejecuta, se va, sin alterar self.active_flag
(la variable de instancia real) de ninguna manera.
Sin embargo (esto fue una fuente de confusión para mí): cuando intenta leer una variable de instancia en Ruby, así:
class SomeData < ActiveRecord::Base
def whats_my_active_flag
puts active_flag
end
end
que realmente va a obtener self.active_flag
(el actual variable de instancia) devuelta.
He aquí por qué:
Rubí hará lo que pueda para evitar volver nil
.
- Inicialmente pregunta "hace
active_flag
existen dentro del alcance de whats_my_active_flag
?
- Se busca y se da cuenta de que la respuesta es 'No', por lo que salta hasta una sola planta, a la instancia de somedata
- Pregunta lo mismo otra vez: "¿existe
active_flag
dentro de este alcance?
- La respuesta es "yup" y dice "Tengo algo para ti" y ¡eso lo devuelve!
Sin embargo, si se define active_flag
dentro del whats_my_active_flag
, y luego se lo solicita, se pasa a través de los pasos de nuevo:
- Se pregunta "¿Qué
active_flag
existen dentro del alcance de whats_my_active_flag
- ? La respuesta es "yup", por lo que devuelve ese valor
En cualquier caso, no será cambio el valor de self.active_flag
a menos que explícitamente se lo indique.
Una manera fácil de describir este comportamiento es "no quiere decepcionarte" y devuelve nil
, por lo que hace todo lo posible para encontrar lo que pueda.
Al mismo tiempo, "no quiere estropear los datos que no tenía la intención de cambiar", por lo que no altera la variable de instancia en sí.
Espero que esto ayude!
posible duplicado de [Cuándo usar 'self' en Ruby] (http://stackoverflow.com/questions/1252031/when-to-use-self-in-ruby) – sepp2k