У меня есть модели, установленные следующим образом:Rails 3 - build_association не работает в fields_for в fields_for
call.rb
belongs_to :contact
contact.rb
has_many :calls
belongs_to :postal_address, class_name: "Address", foreign_key: "postal_address_id"
belongs_to :physical_address, class_name: "Address", foreign_key: "physical_address_id"
адрес.rb
has_many :contacts
На моих контактных новых/редактирования форм, я использую @contact.build_postal_address
и @contact.build_physical_address
в ContactsController
, которые действуют, как и ожидалось. Представленные представления отображаются с пустыми полями для почтового и физического адреса, если это необходимо.
Когда звонок зарегистрирован, во время разговора возникает форма. Один из вложенных ресурсов в этой форме позволяет оператору редактировать контактные данные с той же страницы, что и ввод другой информации о вызове. Для этой формы, где contact
является частью вложенной формы, функции сборки не работают.
Мои формы, используемые в ContactsController
являются следующие:
_contact_form.html.erb
<%= simple_form_for @contact do |f| %>
<%= f.input :name %>
<%= render 'address_fields', f: f, fields: :postal %>
<%= render 'address_fields', f: f, fields: :physical %>
<%= f.submit %>
<% end %>
_address_fields.html.erb
<%= f.simple_fields_for fields do |a| %>
<%= a.input :address_line_1 %>
<% end %>
Мои формы, используемые в CallsController
являются следующими (повторное использование _address_fields
парциальное :)
_call_form.html.erb
<%= simple_nested_form_for @call do |f| %>
<%= f.input :call_comments %>
<%= f.simple_fields_for :contact do |contact| %>
<%= contact.input :name %>
<%= render 'address_fields', f: contact, fields: :postal %>
<%= render 'address_fields', f: contact, fields: :physical %>
<% end %>
<%= f.submit %>
<% end %>
Независимо от того, что я делаю с @contact.build_physical_address
или @contact.build_postal_address
в контроллере, почтовые и физические поля адреса не появляются в форме вызова, если только адрес уже существует под контактом. Если адрес уже существует, вызов действия build_*
на почтовом/физическом уровне также не очищает поля.