attr_accessor ruby-on-rails ruby ruby-on-rails-3 virtual-attribute attr-accessor

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