2016-04-13 24 views
0

Birkaç partials var göstermek için büyük bir if/else liste birleştirmek - bir ana menü için bir tane, bir alt menü için başka, uzun süredir merak vbaktif veya inaktif menü öğelerini

Bir şey . Ben aktif menü öğeleri vurgulanan yapmak, ancak bu örnekte bakmak için biliyorum:

ul.menu-list 
    li 
     - if action_name == 'change_password' 
     a.is-active href="/#{session[:user_type]}/account/change_password" Change Password 
     - else 
     a href="/#{session[:user_type]}/account/change_password" Change Password 
    li 
     - if action_name == 'change_cell' 
     a.is-active href="/#{session[:user_type]}/account/change_cell" Update Contact Number 
     - else 
     a href="/#{session[:user_type]}/account/change_cell" Update Contact Number 
    li 
     - if action_name == 'change_email' 
     a.is-active href="/#{session[:user_type]}/account/change_email" Update Email 
     - else 
     a href="/#{session[:user_type]}/account/change_email" Update Email 
    li 
     - if action_name == 'change_notifications' 
     a.is-active href="/#{session[:user_type]}/account/change_notifications" Update Notification Settings 
     - else 
     a href="/#{session[:user_type]}/account/change_notifications" Update Notification Settings 

O fest if/else bir deli. Bazı eylem düğmeleri (widget'ı düzenle, widget'ı sil) yalnızca belirli kullanıcı türlerinde kullanılabilir. Bu, burada gördüğünüze başka bir gülünç karmaşıklık katmanı ekler.

Burada yanlış olan ne yapıyorum?

cevap

0

Yardımcı görmek için mantığı koyun.

module MyHelper 
    ACTION_TO_STRING = { 
    change_password: 'Change Password', 
    change_cell: 'Update Contact Number', 
    change_email: 'Update Email', 
    change_notifications: 'Update Notification Settings' 
    } 

    def menu_list_from(action_name, user_type) 
    content_tag(:ul, class: 'menu-list') do 
     ACTION_TO_STRING.each do |k, v| 
     klass = k == action_name.to_sym ? 'is-active' : '' 
     concat content_tag(:li) do 
      link_to v, "/#{user_type}/account/#{k}", class: klass 
     end 
     end 
    end 
    end 
end 

Sonra sadece görünümde kullanmak

= menu_list_from(action_name, session[:user_type]) 
: eg için
İlgili konular