FormHelper :: label和FormTagHelper :: label_tag有什么区别?

时间:2009-06-18 04:31:45

标签: ruby-on-rails

我正在写一个处理多个模型的表单。有关如何执行此操作的一些示例使用ActionView::Helpers::FormHelper::label,有些使用ActionView::Helpers::FormTagHelper::label_tag,我并不理解其中的差异。

在我的特定情况下,两者似乎都会产生相同的输出:

<% form_for :post, :url => { :action => 'create' } do %>
  <p>
    <%= label_tag 'post_type' %><br />
    <%= text_field :post, :post_type %>
  </p>
  <p>
    <%= label :post, :parent_post_id %><br />
    <%= text_field :post, :parent_post_id %>
  </p>
  ...

渲染:

  <p>
    <label for="post_type">Post type</label><br />
    <input id="post_post_type" name="post[post_type]" size="30" type="text" />
  </p>
  <p>
    <label for="post_parent_post_id">Parent post</label><br />
    <input id="post_parent_post_id" name="post[parent_post_id]" size="30" type="text" />
  </p>

标签帮助器似乎更有用,因为它可能会有一些额外的东西,因为它知道它标记的模型和属性,但我找不到任何支持它的东西。这两者之间有实际区别吗?我什么时候应该使用一个助手而不是另一个?

2 个答案:

答案 0 :(得分:12)

Rails提供了两种类型的表单助手:专门用于模型属性的表单助手和不用于模型属性的表单助手。 * _tag帮助程序用于创建不依赖于分配给模板的Active Record对象的表单标记。

虽然您所显示的label元素的生成标记没有区别,但在您的情况下,您应该使用label表单助手与您使用其他表单助手一致因为它会自动将for属性设置为关联文本字段元素的正确ID。

答案 1 :(得分:2)

当您使用f.label创建的表单对象内部并且想要引用模型属性时,请使用form_for(...) do |f|。如果你的应用程序是i18n-ed,Rails将使用翻译来显示属性名称。

当您不在表单对象中时使用label_tag。 (或者您在表单对象中,但想要为非模型属性创建虚拟标签。)

所有表单输入都有这两种变体,有_tag后缀select,有select_tag和{{1}}等等