2009-06-24 22 views
8

Digamos que tenemos un hash:conversión de hash para cuerdas en Ruby

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

me gustaría convertirlo en una cadena:

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

en buen chiste;)

Encontré algo así:

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

Tha t resuelve mi problema, pero tal vez hay una mejor solución integrada en la clase de hashtable?

Respuesta

24

Hash incluye Enumerable, lo que puede utilizar collect:

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

sí esto era lo que estaba buscando;) –

0

, usted puede obtener las claves en el hash utilizando

flash.keys 

y luego desde allí se puede construir una nueva matriz de cadenas y luego únete a ellos. Así que algo así como

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

¿Eso es lo que hace falta?

0

inject es infinitamente útil:

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

El único problema con las soluciones presentadas hasta ahora es que por lo general necesitan para enumerar mensajes flash en un orden en particular - y el hash no lo tiene, por lo que en mi humilde opinión es mejor utilizar una matriz predefinida.

+0

También puede utilizar Ruby 1.9, o pedir prestado 'OrderedHash' de ActiveSupport si necesita Rubí 1.8. – molf

0

¿O maby?

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>