4

ネストされたハッシュをネストされたHTMLリストに変換するRailsヘルパーメソッドを作成しようとしています。

例えば:

{
  :parent => "foo",
  :children => [
    {
      :parent => "bar",
      :children => [
        {
          :parent => "baz",
          :children => []
        }
      ]
    }
  ]
}

次のようになります。

<ul>
  <li>foo</li>
  <ul>
    <li>bar</li>
    <ul>
      <li>baz</li>
    </ul>
  </ul>
</ul>

ハッシュには、任意の数のレベル、およびレベルごとに任意の数の親を含めることができます。

これを達成するための最良の方法は何ですか?

4

2 に答える 2

7

再帰的なメソッドを作成して、ネストされたリストのセットにハッシュするようにレンダリングできます。これを関連するヘルパーに配置します。

def hash_list_tag(hash)
  html = content_tag(:ul) {
    ul_contents = ""
    ul_contents << content_tag(:li, hash[:parent])
    hash[:children].each do |child|
      ul_contents << hash_list_tag(child)
    end

    ul_contents.html_safe
  }.html_safe
end
于 2013-02-15T23:11:19.703 に答える
1

ザックケンプの答えは非常に効果的に質問に対処します。私がそうであったように、もう少し一般的なもの(キー名がわからないネストされたハッシュ)を探している場合は、次のモジュールが役立つ可能性があります(https://github.com/sjohnson/auto_hash_display with詳細):

module HashFormatHelper
  # These methods add classes to the HTML structure that are defined in Bootstrap (and can be defined for other CSS frameworks)
  def format_hash(hash, html = '')
    hash.each do |key, value|
      next if value.blank?
      if value.is_a?(String) || value.is_a?(Numeric)
        html += content_tag(:ul, class: 'list-group') {
          ul_contents = ''
          ul_contents << content_tag(:li, content_tag(:h3, key.to_s.underscore.humanize.titleize), class: 'list-group-item')
          ul_contents << content_tag(:li, value, class: 'list-group-item')

          ul_contents.html_safe
        }
      elsif value.is_a?(Hash)
        html += content_tag(:ul, class: 'list-group') {
          ul_contents = ''
          ul_contents << content_tag(:li, content_tag(:h3, key.to_s.underscore.humanize.titleize), class: 'list-group-item')
          inner = content_tag(:li, format_hash(value), class: 'list-group-item')
          ul_contents << inner

          ul_contents.html_safe
        }
      elsif value.is_a?(Array)
        html += format_array(value)
      else
        Rails.logger.info "Unexpected value in format_hash: #{value.inspect}"
        Rails.logger.info "value type: #{value.class.name}"
      end
    end
    html.html_safe
  end

  def format_array(array, html = '')
    array.each do |value|
      if value.is_a?(String)
        html += content_tag(:div, value).html_safe
      elsif value.is_a?(Hash)
        html += format_hash(value)
      elsif value.is_a?(Array)
        html += format_array(value)
      else
        Rails.logger.info "Unexpected value in format_array: #{value.inspect}"
        Rails.logger.info "value type: #{value.class.name}"
      end
    end
    html
  end
end

このコードを使用して、ハッシュ値をHash.from_xml(your_xml_data)に設定し、それをformat_hash(hash)に渡すことで、XMLを表示することもできます。

from_xmlメソッドはXMLタグ属性を取り除く可能性があるため、属性を持たないXMLに最適です。

于 2016-04-29T19:08:55.973 に答える