Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

Helper pour liste déroulante (select/option html) dans rails

Date d'édition 2009-11-06 à 12:33

Vous savez comment faire une liste déroulante avec rubyonrails ?

La faire à la main ? L' helper Select ?

Et non ! Il existe un helper spécifique bien plus intéressant mais il fallait le trouver, il s'agit de 'collection_select'.

Voici comment l'utilisé :

Par exemple afficher la liste des familles de produit dans la fiche produit :

<%= collection_select :product, :family_id, @families, :id, :name %>

Dans l'ordre : l'objet, l'attribut, le tableau d'élément, l'attribut 'value' de la balise <option> et le innertext de la balise <option>, vous pouvez aussi rajouter des paramêtres pour inclure un ligne blanche :

<%= collection_select :product, :family_id, @families, :id, :name, { :include_blank => "- Aucune Famille -" } %>

Vous pouvez encore surcharger le comportement de l'élément selectionné. Dans l'exemple ci-dessous 1 est l'id contenu dans 'value' de <option> de l'élément qui sera selectionné.

<%= collection_select :product, :family_id, @families, :id, :name, { :include_blank => "- Aucune Famille -", :selected => 1 } %>

En espérant que ça en aide quelques uns.

Faire une pause en javascript, wait, sleep

Date d'édition 2009-11-06 à 08:47

Si vous faites du javascript, vous vous êtes certainement déjà posé cette question : Comment faire une pause en javascript ?

Il existe deux plugins sleep et delay, et le mix des deux 'wait' pour jquery :

Vous retrouverez tout ici : https://www.inet411.com/articles/jquery/wait-plugin.html avec des demos.

Apparemment le site est offline : voici l'article

Jquery wait plugin

I found a delay() plugin here and a pause() plugin here. Both of which were great in their own way. The pause() plugin allows for certain features that the delay() plugin does not and visa-versa.

With the pause plugin you can chain as such:

$('#some_div_id').slideDown('fast').pause(2000).slideDown('fast');

That will slide down the #some_div_id div and "pause" for 2 seconds and then slide up the #some_div_id div.

That is great but I also like to put in my own functions. ie.

$('#some_div_id').slideDown('fast').pause(2000,function(){
    $('#some_other_div_id').slideDown('fast');
});

The above will not work with the "pause" plugin but will work with the delay plugin as shown below:

$('#some_div_id').slideDown('fast').delay(2000,function(){
    $('#some__div_id').slideDown('fast');
});

So I simply combined both scripts and allowed for optional chain-ability, default options and a custom callback upon completion.

Here is the script. It's not the delay plugin and it's not the pause plugin - it's BOTH. What word means "pause" and/or "delay"? I guess WAIT will do. So here is the wait plugin for jQuery. Save this file as jquery.wait.js. It's about 4kb.

// Delay Plugin for jQuery
// - https://www.evanbot.com
// - copyright 2008 Evan Byrne
/*
 * Jonathan Howard
 * jQuery Pause
 * version 0.2
 * Requires: jQuery 1.0 (tested with svn as of 7/20/2006)
 * Feel free to do whatever you'd like with this, just please give credit where
 * credit is do.
 * pause() will hold everything in the queue for a given number of milliseconds,
 * or 1000 milliseconds if none is given.
 */
// Wait Plugin for jQuery
// https://www.inet411.com
// based on the Delay and Pause Plugin
 (function($) {
    $.fn.wait = function(option, options) {
        milli = 1000; 
        if (option && (typeof option == 'function' || isNaN(option)) ) { 
            options = option;
        } else if (option) { 
            milli = option;
        }
        // set defaults
        var defaults = {
            msec: milli,
            onEnd: options
        },
        settings = $.extend({},defaults, options);

        if(typeof settings.onEnd == 'function') {
            this.each(function() {
                setTimeout(settings.onEnd, settings.msec);
            });
            return this;
        } else {
            return this.queue('fx',
            function() {
                var self = this;
                setTimeout(function() { $.dequeue(self); },settings.msec);
            });
        }

    }
})(jQuery);

Sample Usage


Sample #1

default wait of 1 second:

$('#link1').wait().slideUp('fast');

Demo #1

Click the link, after ONE second (one second is default) the link will disappear.

Demo Link 1


Sample #2

custom wait time of 2 seconds:

$('#link2').wait(2000).slideUp('fast');

Demo #2

Click the link, after TWO seconds the link will disappear.

Demo Link 2


Sample #3

slideUp,default wait 1 second,custom function on complete to slide back down:

$('#link3').slideUp('fast').wait(function(){
    $('#link3').slideDown('slow');
});

Demo #3

Click the link, the link will immediately slideUp then wait 1 second then slideDown.

Demo Link 3


Sample #4

same as above except you can specify the time to wait instead of the default of 1 second.

$('#link4').slideUp('fast').wait(2000,function(){
    $('#link4').slideDown('slow');
});

Demo #4

Click the link, the link will immediately slideUp then wait 2 seconds then slideDown.

Demo Link 4


Sample #5

using options

$('#link5').wait({
    msec:2000,
    onEnd:function(){
        //do something else
        alert('It has been 2 seconds since you clicked the link.');
    }
});

Demo #5

Click the link, wait for 2 seconds and you will receive a confirmation message.

Demo Link 5

Named_scope pour les performances

Date d'édition 2009-11-05 à 15:49

Quand on développe des applications web avec RubyOnRails le problème des performances se pose tôt où tard (d'ailleur souvent trop tard).

Par exemple on veut connaitre la liste des produits d'un famille :

Controller :
@family = Family.find(params:id)

Dans la vue :
<% @family.products.each do |p| %>
<%= p.picture.path %>
<% end %>

Et là vous regardez les requêtes au serveur : (2 * @family.products.count) requêtes !

C'est pour ça qu'existe l'option :include dans la méthode find, elle met en cache les objets en relation qui sont spécifiés.

Exemple dans le controller @family = Family.find(params:id, :include => {:products => :picture} )

Et là 1 requête.

Et l'avantage, parce que j'ai eu ce problème, c'est qu'on peut utiliser les named_scope :

named_scope :include_products, :include => {:products => :picture}

Du coup dans le controller :
@family = Family.include_products.find(params:id)

Du coup là c'est nettement plus performant !

Changement de repository subversion (svn) sous ubuntu

Date d'édition 2009-11-03 à 12:20

subversion svn

Voilà la problématique :

J'ai un repository que l'on peut considérer comme mort. Ma copie de travail est par chance à jour, mais avec plein de répertoire .svn ....

Et ben pas de problème : il faut créer un server subversion :

Version minimaliste :

sudo mkdir /var/svn
sudo svnadmin create /var/svn/projet
cd /var/svn/projet/conf

Editer les fichiers de config pour autoriser certains utilisateurs.

Création utilisateur svn

Ne pas oublier de démarrer le serveur :

sudo svnserver -d -r /var/svn

Ensuite la commande magique

svn import -m "changement de repository" mon_chemin_local svn://server/projet

En fait svn import ignore les .svn, c'est pour ça que ça ressemble fortement à une installation classique de serveur subversion

Base Postgresql 8.3 et migration ubuntu 9.10

Date d'édition 2009-11-02 à 14:10

Postgresql

J'ai pas pensé à mes bases de données postgresql lors de la mise à niveau vers Ubuntu 9.10. Du coup je n'arrivais pas à accéder à mes bases de données car Ubuntu 9.10 installe postgresql 8.4 par défaut.

Après quelques minutes je me suis rendu compte qu'il suffisait de réinstaller postgresql 8.3, tant mieux...

EDIT Le lien qui suit est peut-être une meilleure solution : migration postgresql 8.3 vers 8.4

Développement ruby et geekeries - rivsc