合并一个大的if / else列表以显示活动或非活动菜单项

时间:2016-04-13 16:19:22

标签: ruby-on-rails if-statement organization slim-lang

我有几个部分 - 一个用于主菜单,另一个用于子菜单等。

我想了很久的一件事。我知道如何突出显示活动菜单项,但请看一下这个例子:

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

这是一个疯狂的if / else节日。某些操作按钮(编辑窗口小部件,删除窗口小部件)仅对某些用户类型可用。这将为你在这里看到的东西增加另一层荒谬的复杂性。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

只需将逻辑放入查看助手即可。例如:

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

然后在你的视图中使用它

= menu_list_from(action_name, session[:user_type])