0

私は次のものを持っています:

BB_AREAS = {
  :about          => {:link => "quem somos", :slug => "quem-somos"},
  :expositors     => {:link => "expositores",:slug => "expositores"},
  :map            => {:link => "planta", :slug => "planta"},
  :activities     => {:link => "atividades",:slug => "atividades"},
  :address        => {:link => "como chegar",:slug => "como-chegar"},
  :support        => {:link => "apoio", :slug => "apoio"},
  :optin          => {:link => "cadastro",:slug => "cadastro"},
  :how_expositors => {:link => "como expor",:slug => "como-expor"},
  :press          => {:link => "imprensa",:slug => "imprensa"},
  :contact        => {:link => "contato",:slug => "contato"},
}

BB_MENU_AREAS       = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:link]}
BB_MENU_AREAS_SLUG  = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:slug]}

そして、私は次のことを考えています。

=render :partial => '/shared/menu', :collection => BB_MENU_AREAS.map {|link, menu| {:link => link, :menu => menu}}, :spacer_template => '/shared/menu_separator'

メニューをBB_AREASと同じ順序でレンダリングしたいのですが、任意の順序でレンダリングされます。

4

2 に答える 2

3

ハッシュは、Ruby 1.9 以降では挿入順で並べられますが、それ以外の場合は内部的な順序になります。

ただし、IMO このデータは実際のオブジェクトの配列に属します。だいたい:

class Area
  attr_accessor :name, :link, :slug
  def initialize(name, link, slug)
    @name = name
    @link = link
    @slug = slig
  end
end

BB_AREAS = [
  Area.new("About", "quem somos", "quem-somos"),
  Area.new("Expositors", "expositores", "expositores"),
  # etc.
]

実際に個々のコンポーネントを順番に抽出する必要がある場合は、そうすることができます。

于 2013-03-05T14:31:34.343 に答える
0

Ruby ハッシュは、Ruby 1.8 以前では順序がありません。ただし、Ruby 1.9 以降では、ハッシュは順序付けられます。ただし、下位互換性のあるソリューションがあります。

BB_AREAS = [
  [:about          , {:link => "quem somos", :slug => "quem-somos"}],
  [:expositors     , {:link => "expositores",:slug => "expositores"}],
  [:map            , {:link => "planta", :slug => "planta"}],
  [:activities     , {:link => "atividades",:slug => "atividades"}],
  [:address        , {:link => "como chegar",:slug => "como-chegar"}],
  [:support        , {:link => "apoio", :slug => "apoio"}],
  [:optin          , {:link => "cadastro",:slug => "cadastro"}],
  [:how_expositors , {:link => "como expor",:slug => "como-expor"}],
  [:press          , {:link => "imprensa",:slug => "imprensa"}],
  [:contact        , {:link => "contato",:slug => "contato"}],
]
BB_MENU_AREAS       = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:link]}
BB_MENU_AREAS_SLUG  = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:slug]}

あなたの見方は何も変わりません。さらに、このデータ構造では、 の代わりに[key]を使用する必要があります.assoc(key)[1]

于 2013-03-05T14:29:14.400 に答える