2009-06-18 7 views
7

J'écris un formulaire qui traite de plusieurs modèles. Quelques exemples de comment faire cela utilisent ActionView::Helpers::FormHelper::label, et certains utilisent ActionView::Helpers::FormTagHelper::label_tag, et je ne comprends pas vraiment la différence.Quelle est la différence entre FormHelper :: label et FormTagHelper :: label_tag?

Dans mon cas particulier, les deux semblent entraîner la même sortie:

<% 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'aide de l'étiquette semble être plus utile, parce que sans doute il y a quelques extra Ce qu'il peut faire, c'est qu'il connaît le modèle et la propriété, mais je ne trouve rien pour l'étayer. Y a-t-il une différence pratique entre les deux? Quand devrais-je utiliser une aide au lieu de l'autre?

Répondre

10

Rails fournit deux types d'aide de formulaire: ceux qui fonctionnent spécifiquement avec les attributs de modèle et ceux qui ne le font pas. Les helpers * _tag permettent de créer des tags de formulaire qui ne reposent pas sur l'assignation d'un objet Active Record au template.

Bien qu'il n'y ait pas de différence dans le balisage généré pour un élément label que vous avez montré, dans votre cas, vous devez utiliser l'assistant formulaire label pour être compatible avec votre utilisation des autres aides de forme et parce qu'il définit automatiquement la for attribuer à l'ID correct de l'élément de champ de texte associé.

2

Utilisez f.label lorsque vous vous trouvez dans un objet de formulaire créé avec form_for(...) do |f| et que vous voulez faire référence à un attribut de modèle. Si votre application est i18n-ed, Rails utilisera la traduction pour afficher le nom de l'attribut.

Utilisez label_tag lorsque vous n'êtes pas dans un objet de formulaire. (Ou vous êtes dans un objet formulaire mais que vous souhaitez créer une étiquette factice pour un attribut non-modèle.)

Toutes les entrées de formulaire ont ces deux variantes, avec et sans le suffixe _tag, comme select et select_tag, etc

Questions connexes