¿Diferencia entre form_for, form_tag?

80

¿Cuál es la diferencia entre form_for y form_tag? ¿Hay algo diferente para form_remote_for y form_remote_tag?

devinross
fuente

Respuestas:

63

Usaría form_for para un modelo específico,

<% 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 crea un formulario básico,

<%= form_tag '/person' do -%>
  <%= text_field_tag "person", "first_name" %>
<% end -%>
ez.
fuente
53

form_forprefiere, como primer argumento, un objeto activerecord; permite crear fácilmente un formulario de creación o edición (para usarlo en una vista "nueva" debe crear una instancia vacía en el controlador, como:

def new
  @foo = Foo.new
end

También pasa una variable de formulario al bloque, para que no tenga que repetir el nombre del modelo dentro del formulario en sí. es la forma preferida de escribir un formulario relacionado con el modelo.

form_tag simplemente crea una etiqueta de formulario (y, por supuesto, prepara silenciosamente un campo oculto antifalsificación, como form_for ); se usa mejor para formularios que no son modelo (en realidad, solo lo uso para formularios de búsqueda simples o similares).

Del mismo modo, form_remote_foryform_remote_tag son adecuados para formularios relacionados con el modelo y no formularios relacionados con el modelo, respectivamente, pero, en lugar de terminar en un método http estándar (GET, POST ...), llaman a un método ajax.

Todo esto y mucho más están disponibles para que lo disfrutes en FormHelper y PrototypeHelper páginas de referencia.

EDITAR 2012-07-13

Prototypese ha eliminado railshace mucho tiempo, y las formas remotas han cambiado por completo. Consulte el primer enlace, con respecto a la :remoteopción de ambos form_fory form_tag.

giorgian
fuente
1
@WowBow tienes razón; después de todo, esta respuesta es bastante antigua y Prototype se eliminó de los rieles hace mucho tiempo. Editaré mi respuesta.
giorgian
¿Qué significa que form_for"prefiere" un objeto ActiveRecord?
shiggity
1
@shiggity: también acepta un símbolo o cadena, por supuesto. Pero dado un objeto ActiveRecord, hace lo correcto.
giorgian
4

Estos deberían ser similares:

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

y:

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

Si desea enviar los mismos parámetros al controlador, deberá definir esto explícitamente.

Matías
fuente
Corto y preciso. [Hermosa expiación]
Absar danés