2009-06-18 10 views
7

Sto scrivendo un modulo che si occupa di più modelli. Alcuni esempi di come utilizzare questo metodo sono ActionView::Helpers::FormHelper::label e alcuni usano ActionView::Helpers::FormTagHelper::label_tag e non capisco davvero la differenza.Qual è la differenza tra FormHelper :: label e FormTagHelper :: label_tag?

Nel mio caso particolare, entrambi sembrano comportare la stessa uscita:

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

L'aiutante Etichetta sembrerebbe essere più utile, perché probabilmente ci sono alcuni extra le cose che può fare perché conosce il modello e la proprietà che sta etichettando, ma non riesco a trovare nulla a sostegno di ciò. C'è una differenza pratica tra i due? Quando dovrei usare un helper invece dell'altro?

risposta

10

Rails fornisce due tipi di helper di moduli: quelli che funzionano specificamente con gli attributi del modello e quelli che non lo fanno. Gli helper * _tag servono per creare tag form che non si basano su un oggetto Active Record assegnato al modello.

Anche se non c'è alcuna differenza nel codice generato per un elemento label come hai mostrato, nel tuo caso si dovrebbe utilizzare il label modulo helper per essere coerente con l'utilizzo degli altri helper delle form e perché imposta automaticamente la for attributo all'ID corretto dell'elemento del campo di testo associato.

2

Utilizzare f.label quando si è all'interno di un oggetto modulo creato con form_for(...) do |f| e si desidera fare riferimento a un attributo modello. Se la tua app è i18n-ed, Rails utilizzerà la traduzione per visualizzare il nome dell'attributo.

Utilizzare label_tag quando non si è in un oggetto modulo. (Oppure si sono in un oggetto di forma, ma vuole creare un'etichetta fittizia per un attributo non-modello.)

Tutti gli ingressi dei moduli hanno queste due varianti, con o senza il suffisso _tag, come select e select_tag, ecc

Problemi correlati