2009-06-18 5 views
7

私は複数のモデルを扱っているフォームを書いています。これを行う方法のいくつかの例はActionView::Helpers::FormHelper::labelを使用し、いくつかはActionView::Helpers::FormTagHelper::label_tagを使用していますが、私は実際にその違いを理解していません。私の特定のケースでFormHelper :: labelと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> 

ラベルヘルパーは、おそらくいくつかの余分があるので、より有用であると思われますそれはモデルとそれがラベルを貼っているプロパティを知っているのでできることだが、それを裏付けるものは何も見つけられない。両者には実用的な違いがありますか?他のヘルパーを使う代わりに、いつヘルパーを使うべきですか?

答えて

10

Railsには2種類のフォームヘルパーが用意されています。モデルヘルパーに特化したヘルパーとモデルヘルパーではないヘルパーです。 * _tagヘルパーは、テンプレートに割り当てられているアクティブレコードオブジェクトに依存しないフォームタグを作成するためのものです。あなたが示してきたようにlabel要素のために生成されるマークアップには差がありませんが、それは自動的にforを設定しているため

は、あなたのケースでは、あなたは他のフォームヘルパーの使用と一致するようにlabelフォームヘルパーを使用しなければなりません属性を関連するテキストフィールド要素の正しいIDに置き換えます。

2

form_for(...) do |f|で作成されたフォームオブジェクト内にあり、モデル属性を参照したい場合は、f.labelを使用します。あなたのアプリがi18n-edである場合、Railsは変換を使用して属性名を表示します。

フォームオブジェクトでない場合はlabel_tagを使用してください。 (または、フォームオブジェクトであるが、非モデル属性のためのダミーラベルを作成したいと思います。)

すべてのフォーム入力はselectselect_tagのように、として_tag接尾辞なしでは、これらの2つのバリエーションを持っている、など

関連する問題