fields_for не работает, когда form_for использует символ - PullRequest
1 голос
/ 29 октября 2010

у меня есть код form_for

<%form_for :a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
.....
<%f.fields_for :b do |b|%>
.....
<%b.fields_for :apples  do |apple|%>
...
<%end%>
....
<%end%>

выводит HTML-код без поля fields_for

<textarea cols="40" id="a_b_apples_content" name="a[b][apples][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>

, когда я изменяю form_for на:

<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>

это просто отлично работает.И это выводит:

<textarea cols="40" id="a_b_apples_content" name="a[b_attributes][apples_attributes][0][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>

, как я хочу.почему символ в form_for не работает нормально? В чем разница между: a и @a в form_for.Благодарю.Я использую рельсы 2.3.8, ruby ​​1.8.7, браузер Chrome.

1 Ответ

1 голос
/ 29 октября 2010

Это распространенный источник разочарования. form_for на самом деле ведет себя по-разному в зависимости от того, передаете ли вы ему символ или объект. Если вы передадите ему символ, например, так:

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

Тогда построитель форм будет работать, но он только установит значения параметров и загрузит значения по умолчанию, если @person существует. Ваш пармский хеш будет выглядеть так:

params = {
  :person => {
    :name => 'bob'
  }
}

Но он не настроит ваш маршрут должным образом. Предполагается, что вы хотите отправить на ту же страницу, на которой уже находитесь. Теперь, если вы дадите ему объект, form_for сделает для вас гораздо больше. Он проверит, является ли этот объект новым или обновляется, и соответственно установит параметры тега формы, а также некоторые другие преимущества.

Честно говоря, я не могу вам сказать почему они ведут себя по-разному. Очевидно, что версия символа по-прежнему имеет доступ к переменной экземпляра (@person в приведенном выше примере), поскольку поля будут заполнены существующими значениями. Простое решение заключается в том, что передача переменной экземпляра - это всегда путь, и она будет работать правильно.

...