¿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?

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 -%>

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.


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.


Corto y preciso. [Hermosa expiación]
Absar danés
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.