Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

Transformer un array d'objet ActiveRecord en hash avec comme clé l'id et l'objet en valeur

Date d'édition 2014-02-07 à 15:34

La petite astuce du jour :

Comment transformer un Array d'objet ActiveRecord en Hash avec comme clé l'id et l'objet en valeur ?

Solution

Hash[Family.all.map{ |f| [f.id,f] }]

Ce qui donne : 

{

     4: #<Family id: 4>,

     5: #<Family id: 5>,

     6: #<Family id: 6>,

}

De rien :-)

"Replace in path" avec des regexp dans RubyMine (jetbrains editor)

Date d'édition 2014-01-22 à 14:12

Il peut être pratique de faire un "remplacer" dans une liste de fichier.

Dans RubyMine -> Edit -> Find -> Replace In path :

Il faut cocher "Regular expression", ensuite dans "Text to find" mettez votre code avec la/les regexp :

<td><%= ([a-z]*)\.id %></td>

Qui matcherait <td><%= product.id %></td> par exemple.

Dans "Replace with" : 

<td><i class="icon-info-sign" title="<%= $1.id %>"></i></td>

Qui remplacerait l’occurrence trouvée par : <td><i class="icon-info-sign" title="<%= product.id %>"></i></td> grâce au $1. Il s'agit d'une "back reference".

Plus d'info ici : https://www.jetbrains.com/ruby/webhelp/find-and-replace-in-path.html

Chainer ses méthodes sans redouter un "NoMethodError" ou "undefined method for NilClass" avec try

Date d'édition 2014-01-17 à 13:24

Il peut être pratique de faire un :

@voiture.roues.first.gonflage

Voiture étant un objet de la classe Voiture.

Roue est une classe et elle belongs_to Voiture

gonflage est un attribut de roue.

Ici pour arriver jusqu'à gonflage, on peut rencontrer plusieurs nil :

@voiture peut être nil. 

Si @voiture n'est pas nil, alors roues.first peut renvoyer nil.

Eh bien il existe un fonction try sur Object (méthode qui vient de Rails et non du Ruby pur) qui permet d'essayer d'appeler une méthode, sur la classe ou sur nil, de sorte que :

@voiture.try(:roues).try(:first).try(:gonflage) renverra soit la valeur de gonflage soit nil.

Utiliser hstore avec le gem Apartment

Date d'édition 2014-01-15 à 14:02

Il m'est arrivé d'avoir besoin de hstore (stockage key/value dans postgres) avec Apartment.
La mise en place n'est pas très compliqué mais il ne faut rien oublier.
Le readme de Apartment est bien fait : https://github.com/influitive/apartment
Personnellement j'ai créé l'extension manuellement :

sudo -s -u postgres
psql
\c mabasededonnees
CREATE SCHEMA hstore; CREATE EXTENSION HSTORE SCHEMA hstore;

Ensuite il faut rajouter dans la config d'apartment :

Apartment.configure do |config|
  [...]
  config.persistent_schemas = ['hstore']
  [...]
end

Egalement dans le database.yml :

development:
  adapter: postgresql
  host: localhost
  database: mabasededonnees
  username: sylvain
  password: sylvain
  schema_search_path: "public,hstore"

La difficulté, ici c'est qui si vous faites un rake apartment:migrate ou rake db:migrate vous allez avoir une erreur :
PG::UndefinedObject: ERROR:  type "hstore" does not exist
Parce que l'extension n'a pas pour propriétaire "sylvain". Il faut donc retourner sur psql pour corriger le tir :

sudo -s -u postgres
psql
\c mabasededonnees
ALTER SCHEMA hstore OWNER TO "sylvain";

Le  "rake apartment:migrate" devrait mieux se passer maintenant.

Changement de comportement entre deux versions de ruby

Date d'édition 2014-01-08 à 09:36

Je compare ici ruby 1.8.7 et ruby 1.9.3 (je pense que l'on peut généraliser à rb 1.8 vs rb 1.9). Ce post sera mis à jour au fur et à mesure de ces découvertes !

Le parsing des dates : 

RUBY 1.8

1.8.7 :005 > Date.parse("10/01/2014").strftime("%d/%m/%Y")

 => "01/10/2014" 

RUBY 1.9

irb(main):004:0> Date.parse("10/01/2014").strftime("%d/%m/%Y")

=> "10/01/2014"

La conversion :

RUBY 1.8

1.8.7 :001 > Integer(nil)

 => 0 

RUBY 1.9

irb(main):002:0> Integer(nil)

TypeError: can't convert nil into Integer

from (irb):2:in `Integer'

from (irb):2

from /home/sylvain/.rvm/rubies/ruby-1.9.3-p392/bin/irb:13:in `<main>'

J'espère que cette page restera la plus courte possible.

Développement ruby et geekeries - rivsc