The Caribbean Weblog

"This blog is continuing @ http://christophemaximin.com "

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 10 septembre 2006

Rails : helper : Marqueur Adsense

Poser des adsense n'aura jamais été aussi facile, exemples d'utilisation :

  1. wadsense([468,60], 'borddemer')
  2. wadsense([250,250], 'pleinair', {:crit => 1234567890})
  3. wadsense([728,90], %w(000000 000000 FFFFFF 999999 CCCCCC))
  4. wadsense([250,250], %w(pleinair borddemer), {'multipreset' => true}) # faire alterner des présets
  5. wadsense([468,60], '["000000","336699"];["000000","FFFFFF"];["FFFF00","0000FF"];["FFFF00","0000FF"];["000000","336699"]'.split(';'))

Comme d'habitude, placez le dans app/helpers/application_helper.rb afin de le rendre accessible à toutes les vues (de tous les controlleurs).

  def wadsense(format, colorset, options = {})
    # déclarations de set de couleurs
    soc =
    {
      'pleinair' => %w(FFFFFF FFFFFF 0000FF 008000 000000),
      'borddemer' => %w(336699 FFFFFF 0000FF 008000 000000),
    }
    
    # et / ou gérer les multi set prédéfinis
    if colorset.is_a?(Array) and options[:multipreset] != true
      rsoc = colorset
    elsif colorset.is_a?(Array) and options[:multipreset] == true
      rsoc = []
      5.times do |i|
        rsoc[i] = ''
        j = 0
        colorset.each do |coset|
          if j == 0
            rsoc[i] << %(["#{soc[coset][i]}",)
          elsif j == colorset.length
            rsoc[i] << %("#{soc[coset][i]}"])
          else
            rsoc[i] << %(",#{soc[coset][i]}")
          end
          j += 1
        end
      end
    elsif colorset.is_a?(String)
       rsoc = soc[colorset]
    end
    # ne pas ajouter de " autour de la couleur si
    # il sagit de couleurs tournantes
    rso = []
    rsoc.each do |color|
      rso << %("#{color}") unless color.include?('[')
    end
    # écriture de la variable
    adsense = <<EOF
    #{'<p style="text-align:center">' if options[:center]}
    <script type="text/javascript"><!--
    google_ad_client = "pub-000000000000000";
    google_alternate_ad_url = "http://your.domain.name.com/google_adsense_script.html";
    google_ad_width = #{format[0]};
    google_ad_height = #{format[1]};
    google_ad_format = "#{format.join('x')}_as";
    google_ad_channel = "#{options['crit']}";
    google_color_border = #{rso[0]};
    google_color_bg = #{rso[1]};
    google_color_link = #{rso[2]};
    google_color_url = #{rso[3]};
    google_color_text = #{rso[4]};
    //--></script>
    <script type="text/javascript"
      src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
    </script>
    #{'</p>' if options[:center]}
 EOF
    adsense
  end

lundi 4 septembre 2006

Rails : Afficher l'age de quelque chose

RubyLogo Tout cela parce que time_ago_in_words ne permet pas de choisir le format du renvoi (jours, mois ou années), il renvoie par minutes, heures, et jours au maximum

Le but de l'exercide étant d'afficher l'age de quelqu'un en partant de sa date de naissance dans un champ MySQL nommé 'birthdate', au format DATE.

  1. Installer le très bon plugin units : gem install units
  2. Inclure la lib dans le controller souhaité (ou dans app/controllers/application.rb pour une inclusion globale) : require 'units/standard'
  3. Dans le view, il ne nous reste plus qu'a écrire : <%= (Time.now - person.birthdate.to_time).to_seconds.to_years.round %> years old

Voilà.

EDIT: et pour ceux qui me demanderaient pourquoi je dois le passer en secondes, je ne sais pas.

vendredi 1 septembre 2006

Ruby on Rails : Françisation de error_messages_for

PS: je viens de trouver (presque) vraie une solution à ce problème, tout est disponible sur ce site : http://www.railtie.net/articles/2006/01/26/enhancing_rails_errors De ce fait, la suite de l'actuel billet est tout à fait obsolète

Le français, c'est chiant.

Rails est plein de helpers, tous utiles mais avec une belle partie destinée à un public anglophone/américain.
Aujourd'hui, je me suis attelé à faire une version française de error_messages_for, qui permet de gérer les apostrophes, féminins et les pluriels des champs, plus le pluriel du titre du formulaire, tout en gardant vos validates_* dans votre model.
Vous devez donc ajouter ceci dans vos helpers (dans app/helpers/application_helper.rb de préférence).
Cette fonction est utilisable de cette façon :
<%= error_messages_for_fr 'commande', :feminin => true, :femff => ['taille','famille'], :plurff => ['termes_du_contrat'] %>

Toutes les nouvelles options sont facultatives :

  • :feminin : Si le formulaire est féminin => "Cette commande ne peut être enregistré à cause d'une erreurs"
  • :femff : Feminin for fields : un array contenant tous les champs féminins ne commençant pas par une voyelle : => "La taille est est invalide"
  • :plurff : Pluriel for fields : un array contenant tous les champs dont le premier mot est pluriel ne commençant pas par une voyelle : => "Les termes du contrat doi(ven)t être accepté(s)"

Alors oui, on peut faire mieux pour optimiser le bon français et éviter les parenthèses comme dans le dernier exemple, mais je ne souhaitais pas sursursurcharger la fonction plus qu'elle ne l'est déjà...

Vu que je suis relativement nouveau à ruby, le code est surement améliorable.

 def error_messages_for_fr(object_name, options = {})
    # gestion  du <h2> à partir de
    # /usr/lib/ruby/gems/1.8/gems/actionpack-1.12.5/lib/action_view/helpers/active_record_helper.rb
    retour = error_messages_for(object_name, options)
    cecette = (options[:feminin] == true) ? 'Cette' : 'Ce'
    esup = (options[:feminin] == true) ? 'e' : ''
    retour.gsub!(/(\d+) (\w+) prohibited this .+ from being saved/,"#{cecette} #{object_name.humanize.downcase} ne peut être enregistré#{esup} à cause \\1 \\2")
    retour.gsub!('1 error','d\'une erreur')
    retour.gsub!(/(\d+) errors/,"de \\1 erreurs")
    retour.gsub!('There were problems with the following fields:','Les champs suivants posent problème&nbsp;:')
    # gestion du sous-titre à partir de
    # /usr/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/validations.rb
    preversion = [ "is not included in the list", "is reserved", "is invalid", 
    "doesn't match confirmation", "must be accepted", "can't be empty", 
    "can't be blank", "is too long \(maximum is (\d+) characters\)", 
    "is too short \(minimum is (\d+) characters\)", "is the wrong length \(should be (\d+) characters\)", 
    "has already been taken", "is not a number" ]
    postversion = [ "n'est pas dans la liste", "est réservé(e)", "est invalide", "ne corresponds pas à la confirmation", 
    "doi(ven)t être accepté(s)", "ne peut être blanc", "ne peut être vide", 
    "est trop long (le maximum étant de \\1 caractères)", "est trop court (le minimum étant de \\1 caractères)", 
    "est de taille incorrecte (devrait être de \\1 caractères", "est déjà pris", "n'est pas un nombre" ]
    preversion.each_index {|w|
      retour.gsub!(/#{preversion[w]}/, postversion[w])
    }

    retour.gsub!("<li>","\n<li>")
    @options = options
    def feminiser(str, ret = nil)
      @options[:femff].each {|x|
        ret = str.gsub(/<li>#{x.humanize}/i, "<li>La #{x.humanize.downcase}")
      } if @options[:femff]
      ret
    end

    def plurieliser(str, ret = nil)
      @options[:plurff].each {|x|
        ret = str.gsub(/<li>#{x.humanize}/i, "<li>Les #{x.humanize.downcase}")
      } if @options[:plurff]
      ret
    end

    def apostropher(str, ret = nil)
      ret = str.gsub(/<li>([aeiouy]+)/i,"<li>L'\\1")
      ret
    end

    double = retour
    double.split("\n").map {|z|
      y = (z.include? '<li>') ? z.downcase : z
      unless y == feminiser(y) or y == plurieliser(y) or y == apostropher(y)
        y.gsub!(/<li>(.+)/,"<li>Le \\1")
      else
        y = feminiser(y) if feminiser(y)
        y = plurieliser(y) if plurieliser(y)
        y = apostropher(y) if apostropher(y)
      end
      retour.gsub!(z,y) if y
    }
    retour
  end

Pages: