2009-06-18 2 views
7

Ich schreibe ein Formular, das sich mit mehreren Modellen beschäftigt. Einige Beispiele dafür, wie dies zu tun ist, verwenden ActionView::Helpers::FormHelper::label, und einige verwenden ActionView::Helpers::FormTagHelper::label_tag, und ich verstehe nicht wirklich den Unterschied.Was ist der Unterschied zwischen FormHelper :: label und FormTagHelper :: label_tag?

In meinem speziellen Fall scheinen beide in der gleichen Ausgabe führen:

<% 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> 
    ... 

Renders:

<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> 

Das Label Helfer scheint sinnvoller zu sein, weil vermutlich dort einige sind extra Dinge, die es tun kann, weil es das Modell und die Eigenschaft kennt, die es beschriftet, aber ich kann nichts finden, um das zu unterstützen. Gibt es einen praktischen Unterschied zwischen den beiden? Wann sollte ich einen Helfer anstelle des anderen verwenden?

Antwort

10

Rails bietet zwei Arten von Formularhelfern: diejenigen, die speziell mit Modellattributen arbeiten, und solche, die dies nicht tun. Die * _tag-Helfer dienen zum Erstellen von Formular-Tags, die nicht darauf angewiesen sind, dass ein Active Record-Objekt der Vorlage zugewiesen wird.

Zwar gibt es keinen Unterschied in der erzeugten Markup für ein label Element, wie Sie haben in Ihrem Fall angezeigt, sollten Sie die label Form Helfer mit der Nutzung der anderen Form Helfern konsistent sein verwenden, und weil es automatisch die for setzt Attribut der korrekten ID des zugehörigen Textfeldelements.

2

Verwenden Sie f.label, wenn Sie sich in einem Formularobjekt befinden, das mit form_for(...) do |f| erstellt wurde, und auf ein Modellattribut verweisen möchten. Wenn Ihre App aktiviert ist, verwendet Rails die Übersetzung, um den Attributnamen anzuzeigen.

Verwenden Sie label_tag, wenn Sie nicht in einem Formularobjekt sind. (Oder Sie sind in einer Form, Objekt, sondern wollen ein Dummy-Label für ein nicht-Modell Attribut erstellen.)

Alle Formulareingaben haben diese beiden Varianten, mit und ohne _tag Suffix, wie select und select_tag, etc

Verwandte Themen