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

Conditionally add class to link_to with slim syntax

我有一个link,代码如下:

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

并且我想向视图添加条件逻辑,因此如果 action_name 相同,则添加 class active

然后我改成下面的代码

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

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

试试这个......

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

希望对您有所帮助。

如果您想获得活动链接,可以为 active_link_to 构建 gem,您可以像这样使用它,它会为您添加活动 class:

=active_link_to 'Payment', account_payment_path

对于你的问题,你可以使用这个:

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

我来晚了,但这是我认为更灵活的方法,即可以与任何 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'
...