Wi wi je viens de m’acheter un nouvel objectif ![]()
Il s’agit du 50mm de chez Canon, avec ouverture à 1.8. Petit achat pas très onéreux dont je vais abuser la semaine prochaine, à Be Zend et au WordCamp
Supposons que vous ayez le cas suivant dans votre application :
Vous affichez, sur une page, un ou plusieurs projets. Et pour chacun de ces projets, vous avez une ou plusieurs tâches.
Vous désirez donc afficher, sur le formulaire de modification d’un projet, des input modifiables et une case à cocher « supprimer » pour chacune de ces tâches.
Vous allez donc placer le code suivant dans votre vue.
Et, afin d’effectuer la manipulation appropriée à chaque fois, le second fichier du gist donné précédemment.
On a vu mieux niveau propreté du code que de placer ce genre de chose dans chacun des modèles utilisant des formulaires imbriqués.
Et si en prime vous commencez à avoir, pour chaque projet, plusieurs membres, plusieurs catégories et plusieurs options, on est très mal barré.
C’est pourquoi Rails 2.3 implémentera un début de réflexion, qui devrait cependant continuer à évoluer dans les versions suivantes permettant de gérer ceci.
Vous devrez donc d’abord commencer par réecrire votre vue.
<% form_for @project do |project_form| %>
<div>
<%= project_form.label :name, 'Project name:' %>
<%= project_form.text_field :name %>
</div>
<% project_form.fields_for :tasks do |task_form| %>
<p>
<div>
<%= task_form.label :name, 'Task:' %>
<%= task_form.text_field :name %>
</div>
<% unless task_form.object.new_record? %>
<div>
<%= task_form.label :_delete, 'Remove:' %>
<%= task_form.check_box :_delete %>
</div>
<% end %>
</p>
<% end %>
<%= project_form.submit %>
<% end %>
Puis votre modèle. Et la, c’est cool, j’ai même pas besoin de faire un document externe tellement c’est simple et clair
class Project < ActiveRecord::Base
has_many :tasks
accept_nested_attributes_for :tasks, :allow_destroy => true
end
Au niveau des validations, a l’heure actuelle (et c’est ce qui va probablement évoluer), lorsqu’une tâche n’est pas validée, l’erreur est reportée sur le projet.
Pas facile donc de savoir quelle tâche vient d’échouer et donc de résoudre le problème facilement. C’est pourquoi la chose va devoir évoluer dans les versions suivantes.
Quoi qu’il en soit, cette nouvelle fonctionnalité, qui apparaitra dans Rails 2.3 me semble particulièrement cool pour être soulignée.
Cet article est fortement inspiré de l’article Nested Model Forms du blog rubyonrails.org, qui explique également comment implémenter cette fonctionnalité dans votre application Rails dès aujourd’hui.
Chose que je vous déconseille cependant. Intégrer le composant d’une version qui n’est même pas encore en alpha n’est jamais une bonne idée
Pour ceux qui ne connaitraient pas encore Git, c’est un logiciel de contrôle de version.
Celui-ci prends beaucoup d’ampleur depuis un an et pourrait être le remplaçant de SVN dans un futur proche.
Peut-être avez-vous également entendu parler de GitHub, qui héberge des projets en permettant leur gestion avec Git.
Quelques logiciels permettent d’installer le logiciel sur sa plateforme, que cela soit pour Windows, Mac OS X ou Linux.
Je n’ai pas testé sous Linux. Cependant sous Windows, j’ai opté pour msysgit. Et sous Mac, Git-Osx-Installer.
Je vous laisse les installer. Attention, sous Mac OS, il y a deux logiciels à installer. Tout d’abord Git, qui apportera les commandes console néessaires. Puis OpenGitGUI qui apportera une interface graphique.

Une fois que c’est installé, lancez Open Git GUI. Puis créez un nouveau repository. Placez-le dans le répertoire de votre choix.
Une fois que cela est fait, nous pouvons configurer GitHUB afin de pouvoir pousser nos commits là-bas et y héberger notre projet.
Puis rendez-vous sur GitHub et cliquez sur le lien « account » en haut à droite.
La, la page de modification de votre compte s’affichera. Si vous descendez dans la page, vous verrez un paragraphe intitulé « SSH Public Keys ».
Il vous faut créer une clé pour chacune des machines depuis laquelle vous manipulerez le projet. Chaque clé est unique à la machine, pas au projet.
Pour connaitre la clé de la machine, retournez dans OpenGitGUI et cliquez sur le menu « aide » puis sur « montrer la clé SSH ».
Si vous n’avez pas encore généré de clé, le bouton « Générer une clé » sera alors accessible. Sinon, cliquez copier dans le presse papier et placez cette clé sur GitHub.
Attention ! Connaitre cette clé permets à n’importe qui de commiter sur tous vos projets hébergés sur GitHub. Ne la partagez pas.
Une fois que ceci est fait, il faut ajouter un dépot distant sur GitHub. Cliquez sur « Dépôt distant » puis « ajouter ».
Donnez-y le nom de votre choix. L’emplacement est indiqué par GitHub, de la forme git@github.com:vous/votre-projet.git
Comme le projet est nouveau, il faut y ajouter les nouveaux fichiers. Faites donc « Commit » puis « Indéxer ».
Placez un commentaire de commit en bas à droite, puis commitez (une ou plusieurs fois afin de séparer vos diverses modifications) puis poussez vers GitHub ![]()
Rendez-vous sur la page de votre projet et vous pourrez constater que celui-ci est correctement hébergé là-bas.
Je viens de publier mon premier plugin pour rails.
Bon son intérêt est limité. Mais au moins maintenant, j’ai réussi à utiliser Git sous Windows (cela fera l’objet d’un article un petit peu plus tard).
Et puis je me suis pas mal amusé à développer ce plugin (ainsi que ses tests).
L’intérêt en est très simple. Une fois installé, vous aurez une méthode de validation de plus, « validates_uri_existence_of ».
Celle-ci, une fois assignée à l’un des champs de votre base de données exigera de ce champ une condition :
Être un lien valide.
Mais pas seulement valide du point de vue du format du lien. Cela serait trop facile et ne nécessiterait pas de méthode spécifique.
Non. Ce plugin va aller vérifier que le lien ne retourne pas d’erreur (dns, 404, …).
Si il en retourne une, cela ne valide pas. Sinon, c’est cool ça valide
Je vous invite, pour plus d’informations, à voir la page du projet. Ainsi que sa documentation (sur la même page).
Dans mes résolutions pour 2009, j’ai dit que je désirais passer plus de temps loin de mon mac et tenter de me sociabiliser un petit peu plus.
Malheureusement, je crois que pour passer moins de temps près de ma machine, il faudra attendre mars, bien que je me sociabilise un petit peu.
En effet, si en mai « fais ce qu’il te plais », en février, « tu ne peux pas te reposer » à cause d’un emploi du temps (très) chargé.
- Le 2, je monte à Saint-Quentin, en Picardie dans les locaux de mon ancienne licence afin de donner une journée de cours sur Ruby et Rails à l’actuelle promotion. Je rentrerai sur Lyon le soir même.
Merci à Harold qui m’hébergera le dimanche soir. - Mais j’y retourne rapidement puisque le 6, je retourne dans les locaux de mon ancienne licence pour la journée de conférence Be-Zend.
L’occasion de revoir mes anciens collègues de promo et de causer un peu de Zend Framework.
Et puis au passage de croiser un Lyonnais-Arrageois qui doit également venir, pocky.
Merci à Joris qui m’hébergera les jeudi et vendredi soir. - Le samedi 7 au matin, je partirai de Saint-Quentin bien avant le lever du jour et en ayant probablement pas beaucoup dormi, pour me rendre à Paris, à la deuxième session du WordCamp. Merci à Claudine qui m’hébergera le samedi soir.
- Le dimanche 8, il est probable (mais c’est encore à déterminer) que je déjeune avec Madrileño.
Bon après cette semaine de taré, on fait un pseudo-break pour essayer de dormir un peu et de se remettre de ses émotions.
Mais pseudo-break seulement. Car …
- Le 21 février, j’organise un RubyCamp à Lyon, dans les locaux du département informatique de l’INSA. Merci à Philippe de faire le lien avec l’administration de l’école
Et puis en plus de ça avec mes collocs, on parle d’aller se faire un week-end de ski. Pour le plaisir évidemment. Mais aussi pour permettre à Sultaniah, mon collocataire malgache (qui a mis les pieds pour la première fois en France en septembre) de découvrir la neige et de se prendre quelques gamelles ![]()
Bon après tout ça, je me prendrais un mois de repos en restant chez moi.
Oh oui et j’ai failli oublier. Bonne année.
Comme vous le savez peut-être déjà, Google est actuellement en train de transférer les comptes feedburner vers leur système intégré aux comptes Google.
Cependant, pour changer des habitudes, la chose merde complètement.
Résultat : malgré un « transfert réussi », je n’ai plus accès à aucun de mes feeds, qui, qui plus est, affichent n’importe quoi maintenant.
J’ai donc du en recréer des nouveaux. Et je vous invite à changer ceux-ci dans votre lecteur.
Le flux RSS du blog en Français
Le flux RSS du blog en Anglais
Hier, nous avons vu comment, avec Rails et JQuery, afficher en live sur une page d’inscription si un pseudonyme est déjà utilisé ou non.
Aujourd’hui, comme nous cherchons à avoir du code qui fonctionne, nous allons voir comment tester celui-ci.
Tout d’abord, sachez que dans l’idée, il ne faudrait pas faire les tests que nous allons faire maintenant, mais pendant.
Si vous commencez à faire des tests alors que vous avez déjà bien démarré votre application, vous allez rapidement vous retrouver à passer un temps fou à écrire les tests du code déjà réalisé.
Mieux vaut faire juste ce qu’il faut de tests à chaque fois que vous écrivez un peu de code.
Nous allons donc, ici, tester toutes les éventualités possibles lors de l’appel à la méthode « nick_available ».
Ce n’est pas bien compliqué puisqu’il n’y en a que deux :
- Le pseudonyme est utilisé
- Le pseudonyme n’est pas utilisé
Tout d’abord, nous allons créer une fixture d’utilisateur de test. Je ne détaillerais pas cela, ce n’est pas l’objet de l’article. Vous pouvez cependant vous documenter.
Nous nommons notre utilisateur « aaron ».
Puis testons son existence. Dans le test fonctionnel de notre contrôleur « users », nous ajoutons donc le test suivant :
def test_nick_available
get :nick_available, {:id => 'aaron'}
assert @response.body == 'NOT'
end
Et nous testons la non existence
def test_nick_not_available
get :nick_available, {:id => 'moimeme'}
assert @response.body == 'OK'
end
Que se passe-t-il lorsque nous exécutons notre test (rake test) ?
La première méthode fait un appel à notre page en utilisant la méthode get et en passant comme paramètre le pseudonyme aaron.
Vu que cet utilisateur existe dans la base, la page va donc afficher ‘NOT’.
Le contenu de @response.body sera donc ‘NOT’, le contenu de notre page.
Pareil avec la seconde méthode, mais à l’inverse. Le contenu sera ‘OK’ puisque l’utilisateur n’existe pas.
Maintenant, voyons la méthode assert.
Celle-ci lèvera une erreur si le résultat passé n’est pas true.
En conséquent, dans notre premier test, si le contenu de la page n’est pas ‘NOT’, notre test échouera. Et inversement dans le second.
Si par la suite, pour une raison x ou y, votre code ne fonctionne plus, vous vous en rendrez alors très rapidement compte puisque votre test échouera.
Oui je sais, je lague à faire des tutoriaux pour débutants de choses qui datent de mathusalem.
Cependant il ne me semble pas en avoir vu de sympa qui utilisent Rails et JQuery.
Commençons d’abord par vérifier l’existence (ou non) du pseudonyme.
Dans notre modèle utilisateur, nous plaçons la fonction suivante :
def nick_available
render :text => 'OK' and return unless User.find_by_login params[:id]
render :text => 'NOT'
end
Par la suite, si vous appelez votre méthode nick_available, vous verrez s’afficher le texte ‘OK’ si le pseudonyme est disponible. Et NOT sinon.
Passons maintenant à notre formulaire d’inscription. Nous avons un champ texte pour le pseudonyme et un div vide qui nous indiquera si le pseudonyme est disponible ou non.
<%= f.text_field :login %>
<span id="availability"></span>
Enfin, nous devons faire un appel ajax à cette méthode lorsque l’utilisateur a fini de taper son identifiant (et pas à chaque fois que celui-ci change. Sauf si nous cherchons à saturer la connexion de l’utilisateur et notre serveur).
<script type="text/javascript">
$(document).ready(function() {
$('#user_login').blur(function () {
username = $('#user_login').val();
if (username == '') {
$('#availability').html('');
return false;
}
$.get('/users/nick_available/'+username, function(data) {
if (data == 'OK') {
$('#availability').html('Disponible');
$('#availability').css('color', 'green');
} else {
$('#availability').html('Non disponible');
$('#availability').css('color', 'red');
}
});
})
});
Ainsi, lorsque le pseudonyme est utilisé, le div ayant pour id « availability » prendra la couleur rouge et la valeur « Non disponible ».
Dans le cas contraire, il affichera en vert « Disponible ».
Si vous utiliser Phusion Passenger (ou mod_rails), vous savez déjà que votre application est démarrée une première fois lors du premier chargement de page.
Puis que tous les autres chargements se baseront sur cette application déjà démarrée, jusqu’à ce que vous la redémarriez.
En gros, si vous modifiez un fichier dans votre application, la modification ne sera pas prise en compte jusqu’à ce que l’application ne soit redémarrée.
Cela permet d’accélérer considérablement le chargement des pages en production.
Pour redémarrer votre application de manière exceptionnelle, il vous suffit de créer le fichier tmp/restart.txt
Après le rechargement de l’application, le fichier sera automatiquement supprimé.
Mais dans des environnements de développement ou de test, ce n’est pas forcément adapté et c’est plutôt lourd de redémarrer l’application à chaque fois.
C’est pourquoi une nouvelle feature a été ajoutée dans le git de passenger il y a quelques jours de cela.
En créant le fichier tmp/always_restart.txt.
Ce document, si il existe, force le redémarrage de l’application. Cependant, contrairement à restart.txt, il n’est pas supprimé après le redémarrage de celle-ci. Votre application sera donc redémarrée à chaque chargement de page.
Bien évidemment, ceci n’est pas à utiliser dans des environnements de production (sauf si vous cherchez volontairement à fortement ralentir votre application).
Le commit en question.La fonctionnalité arrivera probablement dans la branche stable lors de la prochaine release.





