fields_for не работает, когда form_for использует символ

StackOverflow https://stackoverflow.com/questions/4053849

Вопрос

У меня есть код_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 без полей_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>

Когда я изменяю форму_FOFO:

<%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. Спасибо. Я использую Rails 2.3.8, Ruby 1.8.7, веб-браузер Chrome.

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top