【问题标题】: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
        

        【讨论】:

          猜你喜欢
          • 2011-03-05
          • 2012-03-04
          • 1970-01-01
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 2018-07-21
          • 2013-07-26
          相关资源
          最近更新 更多