#16 Virtual Attributes
Ci-dessous, on a un formulaire d'enregistrement qui prend un prénom, un nom et un mot de passe.
Ces champs sont aussi dans la structure de notre base de données :
create_table "users", :force => true do |t| t.string "first_name" t.string "last_name" t.string "password" end
Mais que se passe-t-il si on veut changer l'interface utilisateur qui ferait qu'on aurait un champ full_name
au lieu de champs pour first_name
et last_name
? On peut faire ça en utilisant un attribut virtuel (virtual attribute). Premièrement, nous allons changer le code de notre vue et combiner les champs des deux noms.
<h1>Register</h1> <% form_for @user do |form| %> <ol class="formList"> <li> <%= form.label :full_name, 'Nom complet' %> <%= form.text_field :full_name %> </li> <li> <%= form.label :password, 'Mot de passe' %> <%= form.password_field :password %> </li> </ol> <% end %>
new.html.erb
avec le champ full_name
en place.
Maintenant, quand nous soumettons le formulaire, l'application cherchera un attribut full_name
dans le modèle User
, qui ne l'a pas encore. Nous pouvons le créer en définissant un attribut virtuel pour full_name
.
class User < ActiveRecord::Base # Getter def full_name [first_name, last_name].join(' ') end # Setter def full_name=(name) split = name.split(' ', 2) self.first_name = split.first self.last_name = split.last end end
Les méthodes getter et setter définies dans le modèle User
.
La méthode getter récupère les valeurs de first_name
et last_name
pour l'utilisateur et les retourne, jointes par un espace. La méthode setter sépare la valeur passée au niveau du premier espace et définie le first_name
et le last_name
comme étant la première et la seconde partie de la chaine divisée.
Utiliser des propriétés virtuelles signifie que l'interface utilisateur doit avoir un champ qui correspond à chaque champ de la table correspondante. C'est particulièrement utile quand vous utilisez Rails pour vous connecter à une base de données et que vous ne pouvez pas altérer les champs de ses tables.
Voir ça en action
Nous allons essayer notre nouveau formulaire et voir si ça fonctionne. On va saisir “John Smith” comme nom complet et “secret” comme mot de passe.
Processing UsersController#create (for 127.0.0.1 at 2009-01-10 21:55:44) [POST] Parameters: {"user"=>{"password"=>"secret", "full_name"=>" John Smith"}, "commit"=>"Add user", "authenticity_token"=>"6990f4ad21cb4f9c812a6f10ceef51faa4f46ce7"} User Create (0.4ms) INSERT INTO "users" ("first_name", "last_name", "password") VALUES('John', 'Smith', 'secret')
Partie des logs de développement montrant le nouvel utilisateur étant ajouté à la base de données.
On peut voir à partir des logs de développements précédents que le nom complet a été envoyé à l'action create
(et ensuite au modèle User
), mais que le prénom et le nom sont séparés.
Les attributs virtuels fournissent un moyen puissant et flexible pour vous permettre de personnaliser votre interface utilisateur.