嵌套窗体有一个关联(_O)



我有两个模型狗和垃圾场:

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 %>

我已经查看了文档,从我所能看出的情况来看,这应该是可行的,但是这个页面不在主编辑页面上,我认为这就是问题所在。我是否应该将编辑操作中的内容添加到显示垃圾字段编辑表单的新操作中?

编辑:

我想做的是将编辑表单拆分为单独的页面,我通过添加额外的操作来呈现额外的页面,这样用户就可以转到dogs/settings/leare,例如查看little_field嵌套表单。我曾尝试将@dog.build_litter_field添加到显示字段的littler操作中,但当我尝试保存表单时,我收到了错误:

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,我现在唯一的问题是它在编辑时不会显示保存的值。

如果在edit操作中调用@dog.build_litter_field,它将在之前保存的内容之上构建一个新的LitterField。我建议尝试这样的方法,看看它是否能解决你目前看到的问题:

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

它还可以帮助签出debuggergem。您可以使用它来逐步完成控制器操作,并查看每个语句后对象的样子。

最新更新