ruby-on-rails - 将 ruby​​ 哈希转换为 html 列表

标签 ruby-on-rails ruby hash

我正在尝试像这样解析一个 yaml 文件:

a:
 a1:
 a2:
b:
 b1:
  b11:
 b2:

我得到这样的哈希:

{"a"=>{"a1"=>nil, "a2"=>nil}, "b"=>{"b1"=>{"b11"=>nil}, "b2"=>nil}}

我想把它变成一个列表:

%ul
 %li a
  %ul 
   %li a1
   %li a2
 %li b
  %ul
   %li b1
    %ul
     %li b11
   %li b2

无论哈希有多深,我都在尝试搜索最有效的方法

最后我这样做了:

KeyWords = %w(url)

# Convert a multilevel hash into haml multilevel tree
# Special KeyWords
# url : item url
def hash_to_haml(hash, url = nil)
  haml_tag(:ul) do
    hash.each do |key, value|

      unless KeyWords.include?(key)
        url = get_url(key, value)

        haml_tag(:li) do
          haml_tag(:a, :href => url ) do
            haml_concat(key)
          end
          hash_to_haml(value) if value.is_a?(Hash) && !value.empty?
        end

      end

    end
  end
end

private

def get_url(key, hash)
  # TODO: get full url from hash
  if hash.nil?
    "/#{key}"
  else
    hash.include?("url") ? hash.delete("url") : "/#{key}"
  end
end

现在也准备解析选项了。

最佳答案

要输出为纯 HTML,您只需在 each block 中执行相同函数的递归调用(或使用函数 as each block ,就像我在这里所做的那样):

def hash_to_html key,value
   if value.nil?
     puts "<li>#{key}</li>"
   elsif value.is_a?(Hash)
     puts "<li>#{key}"
     puts "<ul>"
     value.each(&method(:hash_to_html))
     puts "</ul></li>"
   else
     fail "I don't know what to do with a #{value.class}"
   end
end

puts "<ul>"
yourhash.each(&method(:hash_to_html))
puts "</ul>"

要输出到您正在使用的任何模板语言(我认为是 HAML),我们需要跟踪缩进,所以事情有点复杂——我们将使用一个函数来获取缩进深度作为参数,并返回要在每个键/值对上调用的另一个函数,该函数以适当的缩进打印该键/值对(递归)。 (在函数式编程中,以这种方式调用函数称为“部分应用函数”,它们通常比在 Ruy 中更容易定义。)

def hash_to_haml depth
   lambda do |key,value|
     puts " "*depth + "%li #{key}"
      if value.nil?
        # do nothing
        # (single this case out, so as not to raise an error here)
      elsif value.is_a?(Hash)
        puts " "*(depth+1) + "%ul"
        value.each(&hash_to_haml(depth+2))
      else
        fail "I don't know what to do with a #{value.class}"
      end
   end
end

puts "%ul"
yourhash.each(&hash_to_haml(1))

关于ruby-on-rails - 将 ruby​​ 哈希转换为 html 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4588196/

相关文章:

ruby-on-rails - rails 数据库 :migrate fails due to duplicate table

ruby-on-rails - Rails 控制台 - 进程已完成,退出代码为 0

ruby - Ruby 中 lambda 和 def method_name 的区别

c - 匹配(搜索)C 列表中的 URL 的最佳方法(实现白名单或黑名单)?

ruby - 为什么 double splat 仅适用于符号键?

ruby-on-rails - ruby 中的 Like 和 where 条件

php - 在与 Rails 应用程序相同的域中运行 Wordpress 的最佳方法是什么?

ruby - 使用类与模块在 Ruby 中打包代码

ruby - 在 Ruby 中合并 Word 文档

java - 为哈希选择合适的表大小