2013-03-05 8 views
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, но он отображается в произвольном порядке.

+2

карты являются неупорядоченными структурами данных – ant

+6

Какую версию Ruby вы используете? В 1.9+ карты заказываются вставкой, в 1.8 - нет. –

ответ

0

Ruby Hashs без ограничений в 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].

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. 
] 

Если вы фактически необходимости извлекать отдельные компоненты для того, вы можете.

Смежные вопросы