HAML条件标签

时间:2017-04-06 07:32:22

标签: ruby-on-rails ruby haml

我目前正在使用HAML作为模板语言在rails app上构建ruby。我正在寻找创建一个条件,定义一个标签取决于它是否满足,否则它定义一个不同的标签。我知道我可以这样写:

- if ordered
  %ol 
- else
  %ul

但这不是特别干,需要我复制大部分代码。是否有一种非常简单的方法来解决这个问题?我应该查看ruby逻辑来找到它吗?

由于

3 个答案:

答案 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)从视图中调用它