¿Cuál es la diferencia entre form_for y form_tag? ¿Hay algo diferente para form_remote_for y form_remote_tag?
Respuestas:
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 -%>
form_for
prefiere, 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_for
yform_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
Prototype
se ha eliminado rails
hace mucho tiempo, y las formas remotas han cambiado por completo. Consulte el primer enlace, con respecto a la :remote
opción de ambos form_for
y form_tag
.
form_for
"prefiere" un objeto ActiveRecord?
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.