我有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,我现在唯一的问题是它不会在编辑时显示保存的值。
答案 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
宝石。您可以使用它来逐步执行控制器操作,并在每个语句后查看对象的外观。