2012-03-02 14 views
11

Ho usato this gem nella mia domanda, ma non sono sicuro che la differenza tra le diverse opzioni di implementazione per la gemma:Differenza tra form_for e form_tag?

  • form_for
  • form_tag con il blocco
  • form_tag senza blocco

Qualcuno può chiarire? Capisco che form_for sia usato quando desideri interagire con un modello, ma per quanto riguarda gli altri due?

+0

possibile duplicato di [Differenza tra forma \ _per, forma \ _tag?] (Http://stackoverflow.com/questions/1349348/difference-between-form-for- form-tag) –

risposta

14

Le differenze sono sottili, ma importanti. form_for è uno strumento più avanzato che produce un oggetto si utilizza per generare gli elementi del modulo:

<% form_for(@foo) do |form| %> 
    <%= form.text_field(:bar) %> 
<% end %> 

Il metodo form_tag è molto più primitivo e solo emette un tag. Se si vuole mettere le cose all'interno del tag <form> che ha emesso, si mettono le cose all'interno del blocco:

<% form_tag do %> 
    <%= text_field_tag(:bar, 'bar_value') %> 
<% end %> 

Si noti che il metodo form_for gestisce i valori afferrare dal tuo modello, e sarà almeno cercare di indirizzare il modulo per l'azione appropriata. Con form_tag sei responsabile di tutto, dato che non fa supposizioni su ciò che stai facendo.

3

Per quanto ne so, c'è solo una semplice differenza. form_tag senza un blocco genererà solo un elemento html per te. Quando si utilizza il modulo con un blocco, verrà creato anche il tag di chiusura del modulo.

Nell'esempio:

<% form_tag("/comments") %> 

provocherà

<form action="/comments"> 

Dove

<%= form_tag("/comments") do %> 
    <%= submit_tag %> 
<% end %> 

genererà

<form action="/comments"> 
    <input type="sumbit" /> 
</form> 
4

Uno usa il modello di rilegatura e l'altro no

+0

Puoi approfondire quale modello è il binding? – mbigras

+0

@mbigras afaik binding di modello è quando si ha un modulo, (con ad esempio un nome di persone in esso) e automaticamente viene popolato in un oggetto "persona" da binari (o altri framework) su submit. –

+0

come puoi vedere in tadmans example il form_for è "ambito" all'oggetto @ foo (che è il motivo per cui devi solo specificare il nome dell'attributo, bar, a differenza dell'esempio form_tag). Questo tag form_for supporta anche letture/scritture/aggiornamenti su quell'oggetto @foo out of the box –