ruby on rails - attr_accessor - ¿Cómo se vería un getter y setter por defecto en los rieles?
attr_accessor ruby (3)
Cuando se usa ActiveRecord, esta es la versión equivalente de getter y setter:
def tag_list
read_attribute(:tag_list)
end
def tag_list=(val)
write_attribute(:tag_list, val)
end
Esto es lo que estabas buscando?
Sé que puedo escribir attr_accessor: tag_list para crear un atributo virtual tag_list para un objeto en Rails. Esto permite que exista un atributo tag_list en los formularios para el objeto.
Si uso attr_accessor: tag_list, puedo, en el modelo, realizar acciones en tag_list para extraer y manipular datos del formulario.
Lo que quiero saber es que, en lugar de escribir attr_accessor, ¿cómo escribiría un getter y un setter que replicarían completamente la funcionalidad predeterminada de attr_accessor? P.EJ:
def tag_list
#what goes here
end
FYI lo he intentado
def tag_list
@tag_list
end
Esto no funciona.
attr_accessor
es un método incorporado de Ruby y no tiene ningún significado especial en el contexto ActiveRecord. attr_accessor :tag_list
es básicamente equivalente a este código:
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
En los modelos de ActiveRecord, sin embargo, podría ser que desee algo como esto:
def tag_list
self[:tag_list]
end
def tag_list=(val)
self[:tag_list] = val
end
Hay una pequeña diferencia: con el primer método, obj[:tag_list]
no usa el mismo almacenamiento que su getter y setter. Con el último, lo hace.
Explicación del concepto getter / setter
En Ruby, las siguientes dos líneas de código son equivalentes
thing.blabla
thing.blabla()
Ambos llaman al método blabla
del objeto y lo evalúan a la última expresión evaluada dentro de ese método. Esto significa que tampoco necesita una declaración de return
en el caso del método getter anterior, porque el método simplemente devuelve la última expresión en el método ( @tag_list
, el valor de la variable de instancia).
Además, esas dos líneas de código son equivalentes:
thing.blabla=("abc")
thing.blabla = "abc"
Ambos llaman al método blabla=
del objeto. El nombre especial con el carácter =
se puede usar como cualquier otro nombre de método.
El hecho de que los atributos , como a veces se denominan, son, de hecho, métodos sencillos, también puede usar alguna lógica especial transformada en los valores antes de devolverlos o aceptarlos. Ejemplo:
def price_in_dollar
@price_in_euro * 0.78597815
end
def price_in_dollar=(val)
@price_in_euro = val / 0.78597815
end
Notice the code below is in the [Helpers] path. Helpers are now included for
all [Controllers] to work from when instantiated.
module SettergettersHelper
#TODO Wayne
mattr_accessor :nameport
#TODO Wayne Mattingly the code below was replaced BY ABOVE
#TODO and not depricatable RAILS 4.2.3
# def nameport
# @nameport
# end
# def nameport=(nameport)
# @nameport = nameport
#end
end
*Getter from Accounts Controller:*
def index
@portfolio_name = nameport
end
*Setter from Portfolio Controller:*
def show
@portfolio_name = @portfolio_name.portfolio_name #from database call
SettergettersHelper.nameport = @portfolio_name # set attribute
end