无法获得普通的旧的多对一嵌套表单来保存

时间:2011-01-25 16:11:55

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

我在Rails 3.我的模型Clientaddress_id。在我的Client表单中,我嵌套了Address个字段。以下是表单的Address部分:

  <%= f.fields_for @client.address do |address_form| %>
    <div class="field">
      <%= address_form.label :line1 %><br />
      <%= address_form.text_field :line1 %>
    </div>
    <div class="field">
      <%= address_form.label :line2 %><br />
      <%= address_form.text_field :line2 %>
    </div>
    <div class="field">
      <%= address_form.label :city %><br />
      <%= address_form.text_field :city %>
    </div>
    <div class="field">
      <%= address_form.label :state_id %><br />
      <%= select("client[address]", "state_id", State.all.collect {|s| [ s.name, s.id ] }) %>
    </div>
    <div class="field">
      <%= address_form.label :zip %><br />
      <%= address_form.text_field :zip %>
    </div>
  <% end %>

当我尝试保存表单时,我明白了:

Address(#23652762896420) expected, got ActiveSupport::HashWithIndifferentAccess(#23652751466220)

我不明白这意味着什么或为什么我得到它。这是params.inspect的样子:

{"commit"=>"Update Client",
 "authenticity_token"=>"CBw1fQcsUtXs9x6lKTL4zeoekX1cwuFUrZvZpCShHIc=",
 "_method"=>"put",
 "utf8"=>"\342\234\223",
 "action"=>"update",
 "id"=>"16",
 "client"=>{"name"=>"Rosie O'Donnell",
            "address"=>{"city"=>"Grand Rapids",
                        "line1"=>"216 Grandville Ave SW",
                        "zip"=>"49503",
                        "line2"=>"",
                        "state_id"=>"1"},
            "phone"=>"",
            "salon_id"=>"1",
            "email"=>""},
 "controller"=>"clients"}

有人可以告诉我发生了什么事吗?

2 个答案:

答案 0 :(得分:3)

请参阅此处:http://guides.rubyonrails.org/2_3_release_notes.html#nested-object-forms(这是一篇Rails 2.3文章,但它也适用于Rails 3)

Client模型中,您需要这一行:

accepts_nested_attributes_for :address

另外,将嵌套表单的第一行更改为:

<%= f.fields_for :address do |address_form| %>

答案 1 :(得分:1)

假设您的客户类中有以下内容:

accepts_nested_attributes_for :address

attr_accessible :address_attributes

我会修改表格如下:

<%= f.fields_for :address do |address_form| %>
  <div class="field">
    <%= address_form.label :line1 %><br />
    <%= address_form.text_field :line1 %>
  </div>
  <div class="field">
    <%= address_form.label :line2 %><br />
    <%= address_form.text_field :line2 %>
  </div>
  <div class="field">
    <%= address_form.label :city %><br />
    <%= address_form.text_field :city %>
  </div>
  <div class="field">
    <%= address_form.label :state_id %><br />
    <%= select("client[address]", "state_id", State.all.collect {|s| [ s.name, s.id ] }) %>       </div>
  <div class="field">
    <%= address_form.label :zip %><br />
    <%= address_form.text_field :zip %>
  </div>
<% end %>