Різниця між form_for, form_tag?


80

У чому різниця між form_for та form_tag? Чи є щось інше для form_remote_for та form_remote_tag?

Відповіді:


63

Ви б використовували 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 -%>

53

form_forвіддає перевагу, як перший аргумент, об’єкту активного запису; це дозволяє легко створювати або редагувати форму (щоб використовувати її в "новому" поданні, слід створити порожній екземпляр у контролері, наприклад:

def new
  @foo = Foo.new
end

Він також передає змінну форми в блок, так що вам не доведеться повторювати ім'я моделі в самій формі. це кращий спосіб написати форму, пов’язану з моделлю.

form_tagпросто створює тег форми (і, звичайно, мовчки підготуйте приховане антифабричне поле, наприклад form_for); його найкраще використовувати для немодельних форм (я насправді використовую його лише для простих форм пошуку тощо).

Точно так же, form_remote_forі form_remote_tagпідходять для пов'язаних з модельними формами , а не моделі форм , пов'язаних відповідно , але, замість того , закінчуючись в стандартному методі HTTP (GET, POST ...), вони називають АЯКС метод.

Все це та багато іншого доступне для вас, щоб насолодитися у FormHelper та PrototypeHelper довідкові сторінки.

РЕДАГУЙТЕ 13.07.2012

Prototypeбуло видалено з railsдавнього часу, а віддалені форми повністю змінені. Будь ласка, зверніться до першого посилання, з урахуванням :remoteваріанту обох form_forі form_tag.


1
@WowBow ти маєш рацію; врешті-решт, ця відповідь досить давня, і Прототип давно зняли з рейок. Я відредагую свою відповідь.
Джорджіан

Що означає, що form_for"надає перевагу" об'єкту ActiveRecord?
shiggity

1
@shiggity: звичайно, він також приймає символ або рядок. Але враховуючи об’єкт ActiveRecord, він робить правильно.
giorgian

4

Вони повинні бути схожими:

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

і:

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

Якщо ви хочете надіслати ті самі параметри контролеру, вам доведеться це чітко визначити.


Короткий і точний. [Прекрасне
закінчення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.