Différence entre form_for, form_tag?

Quelle est la différence entre form_for et form_tag? Y a-t-il autre chose pour form_remote_for et form_remote_tag?

Vous utiliseriez form_for pour un modèle spécifique,

<% 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 crée la forme de base,

 <%= form_tag '/person' do -%> <%= text_field_tag "person", "first_name" %> <% end -%> 

form_for préfère, comme premier argument, un object activerecord; cela permet de créer facilement un formulaire de création ou d’édition (pour l’utiliser dans une “nouvelle” vue, vous devez créer une instance vide dans le contrôleur, par exemple:

 def new @foo = Foo.new end 

Il transmet également une variable de formulaire au bloc, ce qui vous évite de répéter le nom du modèle dans le formulaire même. C’est la manière préférée d’écrire un formulaire associé au modèle.

form_tag crée simplement une balise de formulaire (et prépare naturellement un champ caché antiforgery, tel que form_for ); il est préférable de l’utiliser pour des formulaires non-modèles (je ne l’utilise en fait que pour des formulaires de recherche simples ou similaires).

De même, form_remote_for et form_remote_tag conviennent respectivement aux formulaires liés au modèle et non aux formulaires associés au modèle, mais au lieu de se terminer par une méthode http standard (GET, POST …), ils appellent une méthode ajax.

Tout cela et beaucoup plus sont à votre disposition dans le FormHelper et PrototypeHelper pages de référence.

EDIT 2012-07-13

Prototype a été retiré des rails il y a longtemps et les formulaires à distance ont complètement changé. S’il vous plaît se référer au premier lien, avec reguard à l’option :remote de form_for et form_tag .

Ceux-ci devraient être similaires:

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

et:

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

Si vous souhaitez soumettre les mêmes parameters au contrôleur, vous devrez le définir explicitement.