2009-06-24 5 views
8

Diciamo che abbiamo un hash:Conversione hash a stringa in Ruby

flash = {} 
flash[:error] = "This is an error." 
flash[:info] = "This is an information." 

Vorrei convertirlo in una stringa:

"<div class='error'>This is an error.</div><div class='info'>This is an information". 

in bello uno di linea;)

Ho trovato qualcosa del genere:

flash.to_a.collect{|item| "<div class='#{item[0]}'>#{item[1]}</div>"}.join 

Tha t risolve il mio problema ma forse c'è una soluzione migliore costruita in classe hashtable?

risposta

24

Hash include Enumerable, in modo da poter usare collect:

flash.collect { |k, v| "<div class='#{k}'>#{v}</div>" }.join 
+0

sì questo era quello che cercavo;) –

0

È possibile ottenere le chiavi nel hash utilizzando

flash.keys 

e poi da lì si può costruire un nuovo array di stringhe e quindi unisciti a loro. Quindi qualcosa come

flash.keys.collect {|k| "<div class=#{k}>#{flash[k]}</div>"}.join('') 

Questo fa il trucco?

0

inject è infinitamente a portata di mano:

flash.inject("") { |acc, kv| acc << "<div class='#{kv[0]}'>#{kv[1]}</div>" } 
0
[:info, :error].collect { |k| "<div class=\"#{k}\">#{flash[k]}</div>" }.join 

L'unico problema con le soluzioni presentate finora è che è solito bisogno di elencare i messaggi istantanei in ordine particolare - e hash non averlo, quindi IMHO è meglio usare array predefiniti.

+0

È inoltre possibile utilizzare Ruby 1.9, o prendere in prestito 'OrderedHash' di ActiveSupport se hai bisogno di Ruby 1.8. – molf

0

O mamma?

class Hash 
    def do_sexy 
    collect { |k, v| "<div class='#{k}'>#{v}</div>" }.flatten 
    end 
end 

flash = {} 
flash[:error] = "This is an error." 
flash[:info] = "This is an information." 

puts flash.do_sexy 

#outputs below 
<div class='error'>This is an error.</div> 
<div class='info'>This is an information.</div>