有条件地使用slim语法将类添加到link_to

时间:2015-06-04 11:29:08

标签: ruby-on-rails ruby slim-lang

我有一个链接,代码如下:

= link_to 'Payment', account_payment_path, class:{'active'}

我想在视图中添加一个条件逻辑,所以如果action_name相同,那么添加类active

然后我改为以下代码

= link_to 'Payment', account_payment_path, class:{'active' if action_name == 'payment'}

但会导致错误。我该如何解决呢?

3 个答案:

答案 0 :(得分:5)

如果你想获得活动链接,那么active_link_to有一个gem构建,你可以像这样使用它,它会处理为你添加活动类:

=active_link_to 'Payment', account_payment_path

您的问题可以使用:

= link_to 'Payment', account_payment_path, class: (action_name == 'payment' ? 'active' : '')

答案 1 :(得分:1)

试试这个......

= link_to 'Payment', account_payment_path, :class => action_name == 'payment' ? 'active' : ''

希望这会对你有所帮助。

答案 2 :(得分:0)

我参加聚会很晚,但是我认为这是更灵活的选择,即可以与任何HTML标签一起使用,无论是ali还是其他任何东西。

# app/helpers/menu_helper.rb
module MenuHelper
  class MenuBuilder
    def initialize(template, active_class_name, active_value)
      @template = template
      @active_class_name = active_class_name
      @active_valule = active_value
    end

    def item(value)
      contents = @template.capture { yield }
      return contents unless value == @active_value

      body = Nokogiri::HTML.parse(contents).at('body')
      # Method :+= does not always work because body.child['class'] could be nil
      body.child['class'] = "#{body.child['class']} #{@active_class_name}"
      body.inner_html.html_safe
    end
  end

  def menu_for(active_class_name, active_value)
    capture { yield MenuBuilder.new(self, active_class_name, active_value) }
  end
end

Rails自动加载该帮助程序,以便您可以在视图中使用它:

# app/views/shared/_left_sidebar.html.slim
aside
  .menu
    ul.list
      = menu_for 'active', yield(:sidebar_menu_l1_active_value) do |m|
        = m.item 'menu-1'
          li = link_to 'Menu 1', '#'
        = m.item 'menu-2'
          li = link_to 'Menu 2', '#'

-

# app/views/home/index.html.slim
- content_for :sidebar_menu_l1_active_value, 'menu-1'
...