【问题标题】:HAML conditional tagsHAML 条件标签
【发布时间】:2017-09-01 02:14:54
【问题描述】:
我目前正在使用 HAML 作为模板语言构建一个 ruby on rails 应用程序。我正在寻找一个条件来定义一个取决于它是否满足的标签,否则它定义一个不同的标签。我知道我可以这样写:
- if ordered
%ol
- else
%ul
但这并不是特别干燥,并且需要我复制大部分代码。有没有一种非常直接的方法来解决这个问题?我应该研究 ruby 逻辑来找到它吗?
谢谢
【问题讨论】:
标签:
ruby-on-rails
ruby
haml
【解决方案1】:
您可以使用content_tag 方法,如下所示。 content_tag documentation
= content_tag(ordered ? "ol" : "ul")
如果你多次需要它,你可以把它放在一个辅助方法中
module Listhelper
def list(ordered, html_options = {})
= content_tag(ordered ? "ol" : "ul")
end
end
用= list(your_variables)从视图中调用它
【解决方案2】:
如果您需要在不同的视图中执行此逻辑,我认为您可以遵循两种方法:
1.制作一个局部并在需要的地方渲染它。如果您需要传递变量,请使用local_assigns
_my_list.html.haml
- if ordered
%ol
- else
%ul
使用它
render 'partials/my_list', ordered: ordered
2。做你自己的帮手
def my_list(ordered)
if ordered
content_tag(:ol, class: 'my-class') do
# more logic here
# use concat if you need to use more html blocks
end else
content_tag(:ul, class: 'my-class') do
# more logic here
# use concat if you need to use more html blocks
end
end
end
使用它
= my_list(ordered)
您可以将有序变量保留在视图之外,并在帮助程序中处理整个逻辑。
如果你问自己要使用什么,那么here 的第一个答案是相当不错的。
【解决方案3】:
定义一个助手。我们将引入ordered 选项来选择标签,其余的都传递给标签。
# app/helpers/application_helper.rb
module ApplicationHelper
def list_tag(ordered: false, **opts)
kind = ordered ? :ol : :ul
haml_tag kind, **opts do
yield
end
end
end
然后,
-# some_view.html.haml
%p
Here's a list:
- list_tag ordered: false, class: 'some_class' do
- @list.each do |item|
%li
= item