Nested_form has_one关联

时间:2013-11-30 12:43:12

标签: ruby-on-rails

我有2个型号dog和litter_field:

class Dog < ActiveRecord::Base

belongs_to :user
has_one :litter_field
accepts_nested_attributes_for :litter_field

attr_accessible :litter_field_attributes

end

class LitterField < ActiveRecord::Base
belongs_to :dog

attr_accessible :breed_type

end

在我的控制器中我有:

class DogsController < ApplicationController

def edit
@dog = Dog.find(params[:id])
@dog.build_litter_field
end

在我看来,我有:

<%= simple_form_for @dog do |f| %>
<%= f.fields_for :litter_field do |l| %>      
  <div>
      <%= l.label :breed_type %>
      <%= l.input_field :breed_type %>
  </div>
  <%= f.button :submit, "Save" %> 
  <% end %>
  

我已经查看了文档,并且我可以告诉它应该有用,但是这个页面不在主编辑页面上,而我假设是问题所在。我是否应该将编辑操作中的内容添加到显示litter_field编辑表单的新操作中?

编辑:

我想要做的是将编辑表单拆分为单独的页面,我通过添加额外的操作来渲染额外的页面,以便用户可以去狗/设置/垃圾,例如看到垃圾场嵌套表格。我已经尝试将@ dog.build_litter_field添加到显示字段的垃圾操作中,但是当我尝试保存表单时,我收到错误:

Failed to remove the existing associated litter_field. The record failed to save when after its foreign key was set to nil.

编辑2:

通过添加以下内容修正了上述内容:

has_one :litter_field, :dependent => :destroy
accepts_nested_attributes_for :litter_field, update_only: true

对于dog.rb,我现在唯一的问题是它不会在编辑时显示保存的值。

1 个答案:

答案 0 :(得分:0)

如果您在@dog.build_litter_field操作中调用edit,它将构建一个新的LitterField覆盖以前保存的任何内容。我建议尝试这样的事情来看看它是否解决了你目前看到的问题:

def edit
  @dog = Dog.find(params[:id])
  @dog.build_litter_field if @dog.litter_field.nil?
end

它还可以帮助结帐debugger宝石。您可以使用它来逐步执行控制器操作,并在每个语句后查看对象的外观。