在Rails3中将块传递给标签助手

7

我希望创建一个包含一些嵌套元素的标签。我正在使用标签助手并尝试将内部HTML作为块传递,但生成的HTML不如我所期望的那样。ERB:

<span>Span element</span>
<%= label("object", "method") do %>
  <span>Inner span</span>
<% end %>

HTML输出:

<span>Span element</span> 
<span>Inner span</span> 

<label for="object_method">
<span>Span element</span> 
  <span>Inner span</span> 
</label>

当我使用<% %>标记传递内部HTML时,输出结果应该如下所示:
ERB:
<span>Span element</span>
<%= label("object", "method") do %>
  <% raw '<span>Inner span</span>' %>
<% end %>

HTML输出:

<span>Span element</span>
<label for="object_method">
  <span>Inner span</span>
</label>

我想知道是我的错误还是ActionView标签助手的错误。对于其他助手,块传递都很正常。

谢谢, Michał

3个回答

14

据我理解,你需要在这种情况下使用助手:

<%= label_tag "my_label_name" do %>
  <span>Inner span</span>
<% end %>
这是因为尽管表单标签助手会自动填写“for”属性(使用模型对象属性),但在嵌套元素中您不需要它。
当您有一个包装内部内容的打开标签(而不是自闭合标签)时,“for”属性是不必要的,因为标签显然与其嵌套内容相关联(这称为隐式关联)。
所以,这是预期的行为 - 看起来Rails团队已经故意构建了这种方式。

5

Scott Lowe的答案是正确的,不过我想再进一步...你甚至不需要使用Rails的label_tag。只需像下面这样使用原始html:

<label>
  <span>Inner span</span>
</label>

如果您要将标签与表单元素(如单选按钮)相关联:

<label>
  <%= f.radio_button :approval_state, 'R' %>
  Rejected
</label>

1
在Rails 3.2.11中,这对我来说是有效的:

<span>Span element</span>
<%= label :item, :method do %>
  <span>Inner span</span>
<% end %>

结果:

<span>Span element</span>
<label for="item_method">
  <span>Inner span</span>
</label>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接