web-dev-qa-db-fra.com

À quoi ressemblerait un getter et un réglage par défaut dans les rails?

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.

24
jay

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.

Explication du concept de getter/setter

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
66
Niklas B.

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?

9
leonardoborges