如何创建 HTML 标签并将其放置在现有 HTML 标签中,并在助手中使用 content_tag?

How do I create an HTML tag and place it within an existing HTML tag with content_tag in a helper?

我有一个 @profile has_many positions。 HTML 版本如下所示:

<h3>Defensive Midfield</h3>
<div class="alternative-positions">
  <small>Attacking Midfield</small><br />
  <small>Right Midfield</small>
</div>

然而,我正在做的是创建一个助手来抽象这个视图逻辑,所以我在我的 profile_helper.rb.

中放了一堆 content_tags

规则如下:

  1. 当个人资料只有 1 个位置时,它会进入 h3 标签。
  2. 当有2个时,第一个进入h3,第二个进入small,在div.alternative-positions.
  3. 当有 3 个时,跟随 #1 & #2 然后将第三个位置放在现有 div.alternative-positions.
  4. 中新创建的 <small>

1 和 2 很简单,我可以用这段代码做到这一点:

  def player_positions(profile)
    profile.positions.each_with_index do |index, position|
      if index == 0
        content_tag(:h3, position.position_type)
      else
        content_tag(:div, content_tag(:small, position.position_type), class: "alternative-positions")
      end
    end
  end

在我看来是这样称呼的:

<%= player_positions(@profile) %>

然而,我遇到的问题是第三个。

我不太确定如何 select div,并确保新创建的 small 标签和内容嵌套在现有 div 中。

我该如何实现?

我建议单独处理列表中的第一个(即不属于每个子句的一部分)例如:

def player_positions(profile)
  position_str = ""
  position_str << content_tag(:h3, profile.positions.first.position_type) if profile.positions.size >= 1
  if profile.positions.size >= 2
    # this is the surrounding div for all other positions
    position_str << "<div class='alternative-positions'>"
    profile.positions[1..-1].each_with_index do |index, position|
      position_str << content_tag(:small, position.position_type)
    end
    position_str << "</div>"
  end
  position_str
end

或类似(注意:未检查拼写错误或错误)