2 votes

Ruby : Comment itérer sur un hachage et faire quelque chose de différent en fonction du nombre d'éléments?

Je travaille avec un hash qui ressemble à ceci :

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}

Cependant, il se peut qu'il n'ait qu'un seul élément :

h = { 
    "side2"=>["verde", "Verde"]
}

J'aimerais afficher le hash de manière à ce qu'il ressemble à ceci :

Utilisateur a changé side1 de green à Green et side2 de verde à Verde

Lorsqu'il y a deux éléments, ils seront séparés par un "et". Sinon, cela ressemblera à ceci :

Utilisateur a changé side2 de verde à Verde

Tout ceci se passe dans mon script de vue Rails. Comment puis-je écrire le code pour pouvoir le faire?

5voto

mu is too short Points 205090

Vous pourriez faire quelque chose comme ceci :

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} de #{v[0]} à #{v[1]}" }.join(' et ')
# "side1 de green à Green et side2 de verde à Verde"

h = { 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} de #{v[0]} à #{v[1]}" }.join(' et ')
# side2 de verde à Verde"

Donc, dans une vue ERB :

L'utilisateur a changé <%= h.map { |k,v| "#{k} de #{v[0]} à #{v[1]}" }.join(' et ') %>.

Si vous faisiez ce genre de chose fréquemment, vous pourriez vouloir créer une fonction d'aide pour cela.

Vous pourriez également utiliser to_sentence étant donné que vous êtes sur Rails :

L'utilisateur a changé <%= h.map { |k,v| "#{k} de #{v[0]} à #{v[1]}" }.to_sentence %>.

L'approche de to_sentence fonctionne également mieux avec plus de deux éléments. Donc, si vous aviez aussi "side3"=>["pancakes", "Pancakes"], vous obtiendriez :

L'utilisateur a changé side1 de green à Green, side2 de verde à Verde, et side3 de pancakes à Pancakes.

1voto

Maurício Linhares Points 19468

Voici une solution possible:

hash = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}

result = hash.map do |key,value|
  "#{key} de #{value.first} à #{value.last}"
end

puts "L'utilisateur a changé #{result.to_sentence}"

La sortie sera :

L'utilisateur a changé side1 de green à Green et side2 de verde à Verde

Alors que si vous avez ajouté un seul élément:

L'utilisateur a changé side1 de green à Green

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X