Rails 3 - build_association无法在fields_for中的fields_for中工作

时间:2013-06-30 12:49:45

标签: ruby-on-rails ruby-on-rails-3 nested-forms

我的模型设置如下:

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"

address.rb

has_many :contacts

在我的联系人新/编辑表单上,我使用@contact.build_postal_address中的@contact.build_physical_addressContactsController按预期行事。如果需要,呈现的视图显示为邮政和物理地址的空白字段。

记录通话时,会在通话过程中显示表单。此表单上的一个嵌套资源允许操作员在同一页面上编辑联系人详细信息,以输入有关该呼叫的其他信息。对于此表单,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_*操作也不会清除字段。

1 个答案:

答案 0 :(得分:1)

原来我在调用表单中调用simple_fields_for是一个问题。

在呼叫控制器中,我必须设置以下内容:

<强> calls_controller.rb

@contact = params[:contact_id]
@contact.build_postal_address if @contact.postal_address == nil
@contact.build_physical_address if @contact.physical_address == nil    
@call = Call.new(contact_id: @contact.id)

在我的电话表格中,我需要修改fields_for联系电话:

<强> _call_form.html.erb

...
<%= f.simple_fields_for :contact, @contact do |contact| %>
...

这导致@contact对象用于fields_for值,而不是@ call.contact对象,该对象未受控制器中build_*方法的影响。