À quoi ressembleraient un getter et un setter par défaut dans rails?
Je sais que je peux écrire attr_accessor: tag_list pour créer un attribut virtuel tag_list pour un objet dans Rails. Cela permet d'avoir un attribut tag_list dans les formulaires pour l'objet.
Si j'utilise attr_accessor: tag_list je peux, dans le modèle, effectuer des actions sur tag_list pour extraire et manipuler des données du formulaire.
Ce que je veux savoir, c'est, au lieu d'écrire attr_accessor, comment écrire un getter et un setter qui répliqueraient complètement la fonctionnalité par défaut de attr_accessor. Par exemple:
def tag_list
#what goes here
end
FYI j'ai essayé
def tag_list
@tag_list
end
Cela ne fonctionne pas.
3 réponses
attr_accessor
est une méthode Ruby intégrée et n'a pas de signification particulière dans le contexte ActiveRecord. {[6] } est fondamentalement équivalent à ce code:
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
Dans les modèles ActiveRecord, cependant, il se peut que vous vouliez quelque chose comme ceci:
def tag_list
self[:tag_list]
end
def tag_list=(val)
self[:tag_list] = val
end
Il y a une légère différence: avec la première méthode, obj[:tag_list]
n'utilise pas le même stockage que votre getter et setter. Avec ce dernier, il n'.
Explication du concept getter/setter
En Ruby, le deux lignes de code suivantes sont équivalentes
thing.blabla
thing.blabla()
Les deux appellent la méthode blabla
de l'objet thing
et évaluent jusqu'à la dernière expression évaluée dans cette méthode. Cela signifie que vous n'avez pas non plus besoin d'une instruction return
dans le cas de la méthode getter ci-dessus, car la méthode renvoie simplement la dernière expression de la méthode (@tag_list
, la valeur de la variable d'instance).
, ces deux lignes de code sont équivalentes:
thing.blabla=("abc")
thing.blabla = "abc"
Les deux appellent la méthode blabla=
du objet thing
. Le nom spécial avec le caractère =
peut être utilisé comme n'importe quel autre nom de méthode.
Le fait que attributs , Comme on les appelle parfois, sont en fait des méthodes simples, vous pouvez également utiliser une logique spéciale transformée sur les valeurs avant de les renvoyer ou de les accepter. Exemple:
def price_in_dollar
@price_in_euro * 0.78597815
end
def price_in_dollar=(val)
@price_in_euro = val / 0.78597815
end
Lorsque vous utilisez ActiveRecord, il s'agit des versions getter et setter équivalentes:
def tag_list
read_attribute(:tag_list)
end
def tag_list=(val)
write_attribute(:tag_list, val)
end
Est-ce ce que vous recherchez?
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