Różnica między form_for, form_tag?

80

Jaka jest różnica między form_for i form_tag? Czy jest coś innego dla form_remote_for i form_remote_tag?

devinross
źródło

Odpowiedzi:

63

Użyłbyś form_for dla konkretnego modelu,

<% form_for @person do |f| %> # you can use f here

    First name: <%= f.text_field :first_name %>
    Last name : <%= f.text_field :last_name %>

<% end %>

Form_tag tworzy podstawowy formularz,

<%= form_tag '/person' do -%>
  <%= text_field_tag "person", "first_name" %>
<% end -%>
ez.
źródło
53

form_forpreferuje jako pierwszy argument obiekt activerecord; pozwala na łatwe tworzenie lub edycję formularza (aby użyć go w „nowym” widoku należy utworzyć pustą instancję w kontrolerze, np .:

def new
  @foo = Foo.new
end

Przekazuje również zmienną formularza do bloku, dzięki czemu nie trzeba powtarzać nazwy modelu w samym formularzu. jest to preferowany sposób pisania formularza związanego z modelem.

form_tagpo prostu tworzy tag formularza (i oczywiście po cichu przygotowuje ukryte pole zabezpieczające przed fałszerstwem form_for); najlepiej nadaje się do nie-modelowych formularzy (właściwie używam go tylko do prostych formularzy wyszukiwania itp.).

Podobnie, form_remote_fori form_remote_tagsą odpowiednie dla formularzy związanych z modelem , a nie odpowiednio dla formularzy związanych z modelem, ale zamiast kończyć się standardową metodą http (GET, POST ...), wywołują metodę ajax.

Wszystko to i wiele więcej jest dostępnych w FormHelper i PrototypeHelper strony odniesienia.

EDYCJA 2012-07-13

Prototypezostał usunięty railsdawno temu, a odległe formy całkowicie się zmieniły. Proszę zapoznać się z pierwszym linkiem, zwracając uwagę na :remoteopcję obu form_fori form_tag.

giorgian
źródło
1
@WowBow masz rację; w końcu ta odpowiedź jest dość stara, a Prototype już dawno został usunięty z szyn. Zmienię odpowiedź.
giorgian,
Co to znaczy, że form_for„preferuje” obiekt ActiveRecord?
shiggity
1
@shiggity: oczywiście akceptuje również symbol lub ciąg znaków. Ale biorąc pod uwagę obiekt ActiveRecord, robi to właściwie.
giorgian
4

Powinny być podobne:

<% form_for @person do |f| %>
  <%= f.text_field :name %>
<% end %>

i:

<%= form_tag '/person' do %>
  <%= text_field_tag "person[name]" %>
<% end %>

Jeśli chcesz przesłać te same parametry do kontrolera, musisz to wyraźnie zdefiniować.

Matthias
źródło
Krótkie i precyzyjne. [Piękna ekspiacja]
Duński Absar,