À 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.

24
demandé sur Niklas B. 2012-01-08 06:06:05

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
65
répondu Niklas B. 2012-01-08 14:27:25

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?

8
répondu leonardoborges 2012-01-08 02:13:26
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
0
répondu user3487016 2015-08-31 01:11:04