我目前正在使用HAML作为模板语言在rails app上构建ruby。我正在寻找创建一个条件,定义一个标签取决于它是否满足,否则它定义一个不同的标签。我知道我可以这样写:
- if ordered
%ol
- else
%ul
但这不是特别干,需要我复制大部分代码。是否有一种非常简单的方法来解决这个问题?我应该查看ruby逻辑来找到它吗?
由于
答案 0 :(得分:1)
定义帮助器。我们将引入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
答案 1 :(得分:0)
如果您需要在不同的视图中执行此逻辑,我认为您可以遵循两种方法:
<强> 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的第一个答案就是非常好。
答案 2 :(得分:0)
您可以如下使用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)
从视图中调用它