【问题标题】:Rails 3 Nested FormsRails 3 嵌套表单
【发布时间】:2011-02-22 03:28:17
【问题描述】:

我有一个 Person 模型和一个 Address 模型:

class Person < ActiveRecord::Base
  has_one :address
  accepts_nested_attributes_for :address
end


class Address < ActiveRecord::Base
  belongs_to :person
end

在我的人员控制器中,我的新操作中有@person.build_address。我的表单构建正确。问题是当我提交表单时,会创建一个人员记录和一个地址记录,但它们没有通过 Person 表中的 address_id 列链接。

我错过了控制器中的步骤吗?

谢谢!

新动作 更新

def new
    @person = Person.new
    @person.build_address

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @person }
    end
  end

表格代码 更新

<%= form_for(@person) do |f| %>
  <% if @person.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@person.errors.count, "error") %> prohibited this person from being saved:</h2>

      <ul>
      <% @person.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :first_name %><br />
    <%= f.text_field :first_name %>
  </div>
  <div class="field">
    <%= f.label :last_name %><br />
    <%= f.text_field :last_name %>
  </div>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.label :telephone %><br />
    <%= f.text_field :telephone %>
  </div>
  <div class="field">
    <%= f.label :mobile_phone %><br />
    <%= f.text_field :mobile_phone %>
  </div>
  <div class="field">
    <%= f.label :date_of_birth %><br />
    <%= f.date_select :date_of_birth %>
  </div>
  <div class="field">
    <%= f.label :gender %><br />
    <%= f.select(:gender, Person::GENDER_TYPES) %>
  </div>
  <div class="field">
    <%= f.label :notes %><br />
    <%= f.text_area :notes %>
  </div>
  <div class="field">
    <%= f.label :person_type %><br />
    <%= f.select(:person_type, Person::PERSON_TYPES) %>
  </div>

<%= f.fields_for :address do |address_fields| %>
 <div class="field">
    <%= address_fields.label :street_1 %><br />
    <%= address_fields.text_field :street_1 %>
  </div>
 <div class="field">
    <%= address_fields.label :street_2 %><br />
    <%= address_fields.text_field :street_2 %>
  </div>
<div class="field">
    <%= address_fields.label :city %><br />
    <%= address_fields.text_field :city %>
  </div>
 <div class="field">
    <%= address_fields.label :state %><br />
    <%= address_fields.select(:state, Address::STATES) %>
  </div>
<div class="field">
    <%= address_fields.label :zip_code %><br />
    <%= address_fields.text_field :zip_code %>
  </div>
<% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

  • 您可以发布您的表格吗?您可能缺少嵌套的 fields_for。
  • 很确定现在的问题是您的关联方式错误。看看我的回答对你有没有帮助。

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


【解决方案1】:

您的Person 模型上需要有accepts_nested_attributes_for :address 才能正常工作。在您的 create 操作中,您可以执行以下操作:

def create
  @person = Person.new(params[:person])
  ...
end

然后 Rails 会处理剩下的事情。

更新:如果address_id 列在people 表中,那么它应该是belongs_to :address,而不是has_one :address

【讨论】:

  • 谢谢!就是这样。我一定在高处和低处搜索过嵌套表单的问题,这一直是我的联想。谢谢。
  • 澄清一下,我认为他的意思是您的accepts_nested_attributes_for :address 模型(不是帖子)上需要有accepts_nested_attributes_for :address。不过答案很好!
【解决方案2】:

为什么您的地址是在您的新操作中构建的,而不是在创建操作中?您正在从未保存的模型构建地址,没有 id,因此无法设置外键。您应该在新操作中保留您的@person,但在保存@person 之后将您的 build_address 放入您的创建操作中。

【讨论】:

  • 如果我不将@person.build_address 放入我的新操作中,则表单不会显示地址字段。我尝试将@person.build_address 放在创建操作中,但它只在地址表中插入了一条空记录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多