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_forbevorzugt 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_tagerstellt 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_forund form_remote_tagfü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
Prototypewurde vor railslanger Zeit entfernt und entfernte Formulare haben sich vollständig geändert. Bitte beziehen Sie sich auf den ersten Link, mit Rücksicht auf die :remoteOption von sowohl form_forals auch form_tag.
form_forein 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.