使用 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 标签一起使用,无论是 a
、li
还是其他标签。
# 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'
...
我有一个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 标签一起使用,无论是 a
、li
还是其他标签。
# 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'
...