Преобразование хеша в строку в Ruby - PullRequest
8 голосов
/ 24 июня 2009

Допустим, у нас есть хеш:

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

Я хотел бы преобразовать его в строку:

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

в один лайнер;)

Я нашел что-то подобное:

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

Это решает мою проблему, но, может быть, есть лучшее решение, встроенное в класс хеш-таблицы?

Ответы [ 5 ]

24 голосов
/ 24 июня 2009

Hash включает Enumerable, поэтому вы можете использовать collect:

flash.collect { |k, v| "<div class='#{k}'>#{v}</div>" }.join
0 голосов
/ 24 июня 2009

Или Мэйби?

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>
0 голосов
/ 24 июня 2009
[:info, :error].collect { |k| "<div class=\"#{k}\">#{flash[k]}</div>" }.join

Единственная проблема с представленными решениями состоит в том, что вам обычно нужно перечислять флеш-сообщения в определенном порядке - и у хеша его нет, поэтому ИМХО лучше использовать предварительно определенный массив.

0 голосов
/ 24 июня 2009

inject бесконечно удобно:

flash.inject("") { |acc, kv| acc << "<div class='#{kv[0]}'>#{kv[1]}</div>" }
0 голосов
/ 24 июня 2009

Вы можете получить ключи в хэше, используя

flash.keys

и затем вы можете создать новый массив строк и затем присоединиться к ним. Так что-то вроде

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

Это делает трюк?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...