Разница между form_for, form_tag?

В чем разница между form_for и form_tag? Что-то другое для form_remote_for и form_remote_tag?

Ответ 1

Вы использовали бы form_for для конкретной модели,

<% 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 создайте базовую форму,

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

Ответ 2

form_for предпочитает, как свой первый аргумент, объект activerecord; он позволяет легко создать форму или изменить форму (чтобы использовать ее в "новом" представлении, вы должны создать пустой экземпляр в контроллере, например:

def new
  @foo = Foo.new
end

Он также передает переменную формы в блок, так что вам не нужно повторять имя модели внутри самой формы. это предпочтительный способ написать модель, связанную с формой.

form_tag просто создает тег формы (и, конечно же, незаметно подготавливает скрытое поле antiforgery, например form_for); он лучше всего используется для немодельных форм (я на самом деле использую его только для простых форм поиска и т.п.).

Аналогично, form_remote_for и form_remote_tag подходят для связанных с моделью форм, а не для связанных с моделью форм соответственно, но вместо того, чтобы заканчиваться стандартным методом http (GET, POST...), они вызывают ajax метод.дел >

Все это и многое другое доступны для вас в FormHelper и PrototypeHelper справочные страницы.

EDIT 2012-07-13

Prototype давно удален из rails, и удаленные формы полностью изменились. Пожалуйста, обратитесь к первой ссылке, с учетом опции :remote как form_for, так и form_tag.

Ответ 3

Они должны быть похожими:

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

и

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

Если вы хотите отправить те же параметры в контроллер, вам нужно будет это явно определить.