Это распространенный источник разочарования. form_for
на самом деле ведет себя по-разному в зависимости от того, передаете ли вы ему символ или объект. Если вы передадите ему символ, например, так:
<% form_for :person do |f| %>
<% f.text_field :name %>
<% end %>
Тогда построитель форм будет работать, но он только установит значения параметров и загрузит значения по умолчанию, если @person существует. Ваш пармский хеш будет выглядеть так:
params = {
:person => {
:name => 'bob'
}
}
Но он не настроит ваш маршрут должным образом. Предполагается, что вы хотите отправить на ту же страницу, на которой уже находитесь. Теперь, если вы дадите ему объект, form_for
сделает для вас гораздо больше. Он проверит, является ли этот объект новым или обновляется, и соответственно установит параметры тега формы, а также некоторые другие преимущества.
Честно говоря, я не могу вам сказать почему они ведут себя по-разному. Очевидно, что версия символа по-прежнему имеет доступ к переменной экземпляра (@person в приведенном выше примере), поскольку поля будут заполнены существующими значениями. Простое решение заключается в том, что передача переменной экземпляра - это всегда путь, и она будет работать правильно.