1

我的模型设置如下:

调用.rb

belongs_to :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_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_*在邮政/物理上调用操作也不会清除这些字段。

4

1 回答 1

1

原来这是我如何在调用表单中调用 simple_fields_for 的问题。

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

call_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值,而不是不受build_*控制器中方法影响的 @call.contact 对象。

于 2013-06-30T12:49:45.053 回答