Le framework mappe les tables avec des modèles par activerecord et mappe le modèle à un couple controleur/vue .
Le mapping repose sur la bijection : un champs de la table correspond à un attribut de l'objet Ruby.
Exemple : la table users avec les champs ''prenom',nom' et la clé 'id' se traduit par une vue avec un formulaire avec deux champs :"prenom " et "nom".
Mais il arrive parfois que l'on veuille parfois manipuler des attributs qui non pas d'existence réelle dans une table . Par exemple je veux traiter prenom et nom comme un champs unique : 'nom complet' , ou ajouter un champs uniquement destiné à la présentation dans un formulaire.
Plusieurs possibilités s'offrent à nous : soit traiter ce champs dans le contrôleur , soit l'ajouter comme un champs virtuel au modèle .
A mon avis la deuxieme solution est la meilleure car elle insère le virtuel au plus tot dans la logique de traitement. Et ainsi elle permet de bien regrouper tous les attributs au sein d'un même objet très flexible.
Pour cela il faut ajouter deux méthodes au modèle :
# models/user.rb
def nom_complet
[prenom, nom].join(' ')
end
def nom_complet=(chaine)
split = chaine.split(' ', 2)
self.prenom = split.first
self.nom = split.last
end
Une autre technique permet aussi de modifier le comportement mais pas le mappage des attributs :
les méthodes write_attribute et read_attribute d'activerecord
def length=(minutes)Si les modifications à prévoir ne sont destinées qu'à l'affichage , il est préférable de d'utiliser des' helpers' mutualisables par plusieurs champs de meme type (exemple : les champs dates ou booleens ) .
write_attribute(:length, minutes.to_i * 60)
end
def length
read_attribute(:length) / 60
end
voir une demo sur railscasts.
Aucun commentaire:
Enregistrer un commentaire