Je sais que je peux écrire attr_accessor: tag_list pour créer un attribut virtuel tag_list pour un objet dans les rails. Cela permet qu'il y ait un attribut Tag_List sous Formes pour l'objet.
Si j'utilise attr_accessor: Tag_List i peut, dans le modèle, effectuez des actions sur Tag_List pour tirer et manipuler les données du formulaire.
Ce que je veux savoir, c'est plutôt, au lieu d'écrire Att_Accessor, comment j'écrirais un getter et un setter qui reproduirait complètement la fonctionnalité par défaut de Att_Accessor. PAR EXEMPLE:
def tag_list
#what goes here
end
Fyi j'ai essayé
def tag_list
@tag_list
end
Cela ne fonctionne pas.
attr_accessor
est une méthode intégrée Ruby et n'a aucune signification particulière dans le contexte Activerecord. attr_accessor :tag_list
est essentiellement équivalent à ce code:
# getter
def tag_list
@tag_list
end
# setter
def tag_list=(val)
@tag_list = val
end
Dans ActiveRecord Models, cependant, il se pourrait que vous souhaitiez 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 votre setter. Avec ce dernier, ça fait.
En rubis, les deux lignes de code suivantes sont équivalentes
thing.blabla
thing.blabla()
Les deux appellent la méthode blabla
de l'objet thing
et évaluez à 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 de getter ci-dessus, car la méthode renvoie simplement la dernière expression dans la méthode (@tag_list
, la valeur de la variable d'instance).
En outre, ces deux lignes de code sont équivalentes:
thing.blabla=("abc")
thing.blabla = "abc"
Les deux appellent la méthode blabla=
de l'objet thing
. Le nom spécial avec le =
Le caractère peut être utilisé comme n'importe quel autre nom de méthode.
Le fait que attribue , comme on l'appelle parfois, sont en fait des méthodes simples, vous pouvez également utiliser une logique spéciale transformée sur les valeurs avant de retourner ou d'accepter eux. 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 équivalentes Getter et Setter:
def tag_list
read_attribute(:tag_list)
end
def tag_list=(val)
write_attribute(:tag_list, val)
end
Est ce que c'est ce que vous recherchiez?