4

我想生成像这样的html,

<label for='field'>
  Label Text
  <span class='span1'> Some Text 1 </span>
  <span class='span2'> Some Text 2 </span>
  ...
</label>

我想要一个助手,例如,

label_for 'field', :label => 'Label Text', :type1 => 'Some Text 1', :type2 => 'Some Text 2'

为此,我尝试做类似的事情,

 content_tag(:label, opts[:label], :for => field_name) do
   ['span1', 'span2'].map { |i| 
     content_tag(:span, opts[i], :class => i) if opts[i] }.compact.joins('+').html_safe
   }
  end

但这不起作用(当然)。

['span1', 'span2'] 数组是固定的,用户可以根据需要选择显示尽可能多的跨度。

我怎么解决这个问题?

4

3 回答 3

4

为什么不这样呢?

def special_label_for(field_name, label_text, span_array)
  content_tag "label", :for => field_name do
    concat label_text
    span_array.each_with_index do |span_content, index|
      concat content_tag("span", span_content, :class => "span" + index.to_s)
    end
  end
end

special_label_for :user_name, "User Name", ["This is the first Span", "And this is the second Span", "Can also have a third span", "Or as many spans as you like"]

尚未测试此代码,可能需要添加/删除concathtml_safe以使其在您的视图中正确呈现。

于 2012-06-29T02:38:25.547 回答
0

类似的事情我需要标签中的多个 html 元素。我在这里解决了

http://apidock.com/rails/ActionView/Helpers/FormTagHelper/label_tag#1428-Html-inside-Lable-tag

您可以传递参数以使动态

于 2013-06-05T10:34:47.047 回答
0

你甚至可以做这样的事情:

如果给定的数组是list_of_items

list_of_items.map{ |item| content_tag(:span, item) }.join('').html_safe

于 2020-09-15T18:41:08.413 回答