将块传递给rails3中的标签助手

时间:2011-05-22 13:54:48

标签: ruby-on-rails ruby-on-rails-3 label block actionview

我想用一些嵌套元素创建标签标签。我正在使用标签帮助器并尝试将内部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>

当我使用&lt; %%&gt;传递内部html时标记输出应该是:
再培训局:

<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标签助手中是不是我的错误或错误。对于其他帮助者,块传递工作正常。

谢谢, 米哈尔

3 个答案:

答案 0 :(得分:10)

我的理解是在这种情况下你需要使用label_tag助手:

<%= label_tag "my_label_name" do %>
  <span>Inner span</span>
<% end %>

这样做的原因是虽然表单标签助手为您填充了“for”属性(使用模型对象属性),但您不需要使用嵌套元素。

当你有一个打开的标签标签(而不是自动关闭),包装内部内容时,不需要“for”属性,因为标签显然与其嵌套内容相关联(这称为隐式关联) )。

所以,这是预期的行为 - 看起来Rails团队故意以这种方式构建它。

答案 1 :(得分:4)

Scott Lowe的回答是正确的,虽然我会更进一步......你甚至不需要使用Rails label_tag。只需使用原始html:

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

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

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

答案 2 :(得分: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>