Bonjour,
Je m’adresse aux experts, car je me demande si il n’y a pas une manière
plus elegante de resoudre mon problème. En effet, je veut convertir une
chaine de la forme:
“elem1:value1!elem2:value2!elem3:value3”
pour les mettre dans un ActiveRecord, avec bien entendu des champs
elem1,elem2,elem3
Difficultée, on peut avoir: elem1:!
c’est a dire elem1 n’est pas defini, ou vide…
Approche bourrine:
hash_addr=Hash.new
value.split('!').each do|elem|
res=elem.split(':')
if res.size > 2
hash_addr[res[0]]=res[1]
end
end
# La, j'ai un tableu de hash, que j'utilise comme ca
# en creation:
@place=Place.new(hash_addr)
# ou comme ca, en update
@place.attributes=hash_addr
Y a pas plus simple?
On 7/20/06, Thomas L. [email protected] wrote:
Difficultée, on peut avoir: elem1:!
A mon avis un expression régulière donnera déja plus de souplesse vis Ã
vis
des cas tordu
value.split(//)
(de tête avec la chaleur je sais pas exactement laquelle 
Bonjour,
Je pense que ta solution est bonne.
Si tu veux un peu d’élégance tu peux peut-être créer une method
to_hash pour les Strings. Ni rails ni ruby n’ont une telle fonction :
(dans environment.rb)
class String
def to_hash(seperation=’!’, assignment=’:’)
hash = Hash.new
self.split(seperation).each do |elemement|
pieces = elemement.split(assignment)
hash[pieces[0]] = pieces[1]
end
hash.delete_if { |key, value| value.nil? }
end
end
Après tu pourras faire :
“elem1:value1!elem2:value2!elem3:value3”.to_hash
Ou encore si tu en as besoin… (peut-être pas mais bon) :
“elem1/value1|elem2/value2|elem3/value3”.to_hash(’|’, ‘/’)
Tu peux mettre le delete_if sous condition dans la définition de ta
méthode si tu n’a pas toujours besoin de supprimer les couples clef/
valeur ayant une valeur nulle.
Peut-être d’autres connaîtrons une meilleure solution mais la tienne
ne paraît pas si mal 
NP
Le 20 juil. 06 à 14:43, Thomas L. a écrit :
Salut Thomas,
c’est a dire elem1 n’est pas defini, ou vide…
Approche bourrine: (…)
Je ne trouve pas ton approche si bourrine, je te propose ça :
hash = {}
str.split(’!’).each do |e|
key, value = e.split(’:’, 2)
hash[key] = value.blank? ? nil : value
end
Si utiliser #inject est un signe d’élégance, alors tu peux écrire
ça :
hash = str.split(’!’).inject({}) do |acc, e|
key, value = e.split(’:’, 2)
acc[key] = value.blank? ? nil : value
acc
end
à tester avec :
str =
‘elem1:value1!elem2:value2!elem3:value3!elem4:!elem5!un:deux:trois’
– Jean-François.