代码之家  ›  专栏  ›  技术社区  ›  Jeremy Thomas

使用单行循环在Rails视图中生成HTML类

  •  1
  • Jeremy Thomas  · 技术社区  · 6 年前

    我有一个哈希格式:

    @meals = [
            {
                name: 'Roasted Chicken A La Ratatouille',
                description: '',
                tags: ['chicken'],
                type: ['program'],
                image_url: ''
            },
            {
                name: 'Turkey Nuggets with Buffalo Cauliflower & Spinach',
                description: '',
                tags: ['turkey'],
                type: ['program', 'veggies'],
                image_url: ''
            }
         ]
    

    我想把饭打开 type 作为元素的类名:

    <% meals.shuffle.each do |meal| %>
    
      <!-- Line in question --> 
      <div class="item col-3 p-2 a b <%= meal[:type].each {|t| t } %>">
      <!-- End line in question --> 
    
        <div class="card">
          <img class="card-img-top" src="<%= meal[:image_url] %>">
          <div class="card-body">
            <h5 class="card-title font-medium"><%= meal[:name] %></h5>
          </div>
          <div class="card-footer text-muted justify-content-center row">
            <% meal[:tags].each do |tag| %>
              <span style="margin: 2px;" class="badge bg-info-gradiant pointer"><%= tag %></span>
            <% end -%>
          </div>
        </div>
      </div>
    <% end %>
    

    但当视图呈现时,它显示为:

    <div class="item col-3 p-2 a b ["program"]" style="position: absolute; left: 295px; top: 0px;">
        <div class="card" style="height: 399px;">
            ...
        </div>
    </div>
    

    其中程序显示在括号内。是否有不同的方法来实现这一点,以便数组中的值作为类名应用?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Rory O'Kane Erce    6 年前

    你可以使用 Array#join 要将类数组显式转换为以空格分隔的类名字符串,请执行以下操作:

    <div class="item col-3 p-2 a b <%= meal[:type].join(' ') %>">
    

    它是如何工作的:

    > meal[:type]
    => ["program", "veggies"]
    > meal[:type].join(' ')
    => "program veggies"
    

    注意 meal[:type].each 不会像你想象的那样去做。它为中的每个元素调用块 meal[:type] 数组,期望块执行副作用(例如记录某个内容或保存某个内容),然后返回未修改的 膳食[类型] 数组。如果你想得到一个新的数组,你必须使用 Array#map 而是:

    > meal[:type].each { |t| t.reverse }
    => ["program", "veggies"] # the block doesn’t affect the return value
    > meal[:type].map { |t| t.reverse }
    => ["margorp", "seiggev"] # the block affects each returned element