Was ist der Unterschied zwischen form_for und form_tag? Ist etwas anders für form_remote_for und form_remote_tag?
Antworten:
Sie würden form_for für ein bestimmtes Modell verwenden.
<% 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 Grundform erstellen,
<%= form_tag '/person' do -%>
<%= text_field_tag "person", "first_name" %>
<% end -%>
form_for
bevorzugt als erstes Argument ein Activerecord-Objekt; Es ermöglicht das einfache Erstellen oder Bearbeiten eines Formulars (um es in einer "neuen" Ansicht zu verwenden, sollten Sie eine leere Instanz im Controller erstellen, z.
def new
@foo = Foo.new
end
Außerdem wird eine Formularvariable an den Block übergeben, sodass Sie den Modellnamen nicht innerhalb des Formulars selbst wiederholen müssen. Dies ist die bevorzugte Methode zum Schreiben eines modellbezogenen Formulars.
form_tag
erstellt einfach ein Formular-Tag (und bereitet natürlich stillschweigend ein verstecktes Feld gegen Fälschungen vor form_for
). Es wird am besten für Nichtmodellformulare verwendet (ich verwende es eigentlich nur für einfache Suchformulare oder ähnliches).
In ähnlicher Weise form_remote_for
und form_remote_tag
für Modell verwandten Formen geeignet sind und nicht verwandten Formen modellieren jeweils aber, statt in einem Standard - HTTP - Methode endet (GET, POST ...), rufen sie eine Ajax - Methode.
All dies und noch viel mehr stehen Ihnen im FormHelper zur Verfügung und PrototypeHelper Referenzseiten.
EDIT 2012-07-13
Prototype
wurde vor rails
langer Zeit entfernt und entfernte Formulare haben sich vollständig geändert. Bitte beziehen Sie sich auf den ersten Link, mit Rücksicht auf die :remote
Option von sowohl form_for
als auch form_tag
.
form_for
ein ActiveRecord-Objekt "bevorzugt" wird?
Diese sollten ähnlich sein:
<% form_for @person do |f| %>
<%= f.text_field :name %>
<% end %>
und:
<%= form_tag '/person' do %>
<%= text_field_tag "person[name]" %>
<% end %>
Wenn Sie dieselben Parameter an den Controller senden möchten, müssen Sie dies explizit definieren.