Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

Will_paginate v3.0 pour rails 3.0 et rails 3.1 est sortie !

Date d'édition 2011-08-09 à 22:14

Grande nouvelle le gem will paginate pour la pagination des données dans rails 3 vient de sortir en version 3 ! Au menu plusieurs sortes de pagination : voir ici : https://mislav.uniqpath.com/will_paginate/ sinon voici le lien des sources du gem sur github : https://github.com/mislav/will_paginate/

Utiliser ERB avec ruby sans rails

Date d'édition 2011-08-05 à 08:58

ERB est le moteur de template utilisé par RubyOnRails. Il peut être intéressant de l'utiliser avec ruby seulement.

Je vous préviens ce n'est pas très compliqué, mais il y a une petite subtilité :

require 'erb'

ma_variable = "rivsc"

ERB.new("Hello <%= ma_variable %>").result

Si tout va bien ça devrait planter. Erb ne connait pas l'environnement (méconnaissance des variables déclarées à l'extérieur d'erb et utilisées à l'intérieur). Voici la subtilité il faut passer binding (https://www.ruby-doc.org/core/classes/Binding.html) à la méthode result :

require 'erb'

ma_variable = "rivsc"

ERB.new("Hello <%= ma_variable %>").result(binding)

Voilà ça marche !

Retrouve le premier enregistrement DNS sur une IP (reverse DNS)

Date d'édition 2011-07-12 à 17:01

Voici la fonction ruby équivalent à la fonction php gethostbyaddr() qui permet de faire du reverse DNS (renvoie le PTR record ou pointer record associé à une ip)

require 'socket'

puts Socket.gethostbyaddr([XXX,XXX,XXX,XX].pack("CCCC"))

Cette technique est utilisé par les SEO black hat pour detecter les robots des moteurs de recherche.

Ruby Enterprise Edition erreur certificate verify failed avec Open-uri

Date d'édition 2011-07-08 à 09:38

Si vous avez cette erreur et que vous faites un open sur une url en https (avec ruby Enterprise Edition ou ruby 1.8.7 parfois), rassurez-vous vous n'êtes pas seul :

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

Voici une solution (bien crade soit-dit en passant, et de plus je me fiche de vérifier les certificats ici) :

- Créer un fichier dans config/initializers, je l'appelle bypass_ssl_verification_for_open_uri.rb

- On y mets OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE #<< C'est bien crade hein !

Voilà si vous avez une meilleur solution n'hésitez pas !

Varargs en ruby pour gérer les OR sql dans un ActiveRelation

Date d'édition 2011-07-06 à 15:44

J'ai eu besoin récemment de faire des "ou" (or) avec ActiveRecord, pas moyen de faire des ActiveRelation car à chaque méthode where() appelée, ActiveRecord fait un "et" (and). Le nombre de conditions doit également être variable.

Car dans cet exemple : je veux remonter les contacts qui veulent bien être contacté par sms OU BIEN par email  OU BIEN par courrier.

Si j'avais fait ceci dans le but de remonter les contacts qui veulent être contacté par courrier :

armailing.where(' "contacts"."by_email" = ? OR "contacts"."by_sms" = ? OR "contacts"."by_letter" = ? ', false, false, true)

Cela m'aurait aussi remonté les contacts ne désirant pas être contacté par email ainsi que les contacts ne désirant pas être contacté par sms en plus des contacts souhaitant être contacté pas courrier !

donc voici ce que je devrais faire :

armailing.where(' "contacts"."by_letter" = ? ', true)

Et maintenant si je veux pouvoir remonter les contacts souhaitant être contacté par sms ou courrier et que je fais :

armailing.where(' "contacts"."by_email" = ? OR "contacts"."by_sms" = ? OR "contacts"."by_letter" = ? ', false, true, true)

Même problème que tout à l'heure ici ActiveRecord va également remonter les contacts ne désirant pas être contacté par email, voici comment faire :

armailing.where(' "contacts"."by_sms" = ? OR "contacts"."by_letter" = ? ', true, true)

Donc pour finir voici la solution pour tous les cas :

array_of_conditions = []
condsms    = true #ou false
if condsms then
  array_of_conditions << '"contacts"."by_sms" = ?'
end
condemail  = false #ou true
if condemail then
  array_of_conditions << '"contacts"."by_email" = ?'
end
condletter = true #ou false
if condletter then
  array_of_conditions << '"contacts"."by_value" = ?'
end
if not array_of_conditions.empty? then
  armailing = armailing.where("(" + array_of_conditions.join(" OR ") + ")", *Array.new(array_of_conditions.length, true))
end

De ce fait ici je dois passer à ActiveRecord un tableau de taille variable à la méthode where(). Et un tableau est différent d'une liste d'argument :

  armailing = armailing.where(".... ? ..... ? ....? ", [true, true, true])

Différent de :

  armailing = armailing.where(".... ? ..... ? ....? ", true, true, true)

La parade c'est d'utiliser les varargs avec le signe *.

  armailing = armailing.where(".... ? ..... ? ....? ", *[true, true, true])

Pareil que :

  armailing = armailing.where(".... ? ..... ? ....? ", true, true, true)

Bon coding !

Développement ruby et geekeries - rivsc