Rails - 用于链接has_one的嵌套表单,其中已创建子对象

时间:2012-09-16 08:22:33

标签: ruby-on-rails associations nested-forms

我有两个在has_one / belongs_to关联中链接的模型;分别是Computer和Ipv6Address。

我已经预先填充了Ipv6表以及我希望它拥有的所有条目,现在我需要在计算机新/编辑表单上有一个下拉列表,从Ipv6中选择一个项目以将其与

到目前为止,我所看到的所有内容似乎只在您在新表单上同时创建两个对象然后编辑它们时才起作用。

我已经尝试按照我在网上找到的示例来设置我的MVC,但我不断收到错误,如下面这些代码摘录:

电脑型号:

class Computer < ActiveRecord::Base
  accepts_nested_attributes_for :ipv6_address
  has_one :ipv6_address
  ...

Ipv6Address模型:

class Ipv6Address < ActiveRecord::Base
  attr_accessible :computer_id, :ip_address
  belongs_to :computer
  ...

电脑控制器:

class ComputersController < ApplicationController
  def new
    @computer = Computer.new
    @ipv6s = Ipv6Address.where('computer_id IS NULL').limit(5)
  end

  def edit
    @computer = Computer.find(params[:id])
    @ipv6s = Ipv6Address.where('computer_id = #{@computer.id} OR computer_id IS NULL').order('computer_id DESC').limit(5)
  end

计算机新表格:

<%= simple_form_for( @computer ) do |f| %>
  <%= f.fields_for :ipv6_addresses do |v6| %>
    <%= v6.input :ipv6_address, :collection => @ipv6s %>
  <% end %>
  <% f.button :submit %>
<% end %>

浏览计算机新表单时出错:

NoMethodError in ComputersController#new

private method `key?' called for nil:NilClass

没有为此错误提供代码行引用,但仅当我在计算机新表单中包含嵌套表单时才会显示。

关于导致它的原因或我如何更好地了解我正在做的事情的任何想法?

修改

事实证明,我需要在计算机模型中的accepts_nested_attributes_for :ipv6_address行后面has_one :ipv6_address

修复了表单加载的问题。

根据Yarden的回答,我还将“ipv6_address”的所有实例单独化,以反映has_one关系。

然而,一旦以新形式执行此操作,ipv6字段就完全消失了。如果我不能很快解决它,我会用这个问题打开一个新问题。

1 个答案:

答案 0 :(得分:0)

尝试添加':',我认为这可能是问题所在:

 <%= f.fields_for :ipv6_addresses do |v6| %>

你忘记添加'。'这里:

@ipv6s = Ipv6Address.where('computer_id IS NULL').limit(5)

更改后编辑:

问题是它只有一个has_one关系所以它不知道你的模型中所说的ipv6_address的复数...你需要将它改为:ipv6_address而不是:ipv6_addresses ...

同样在您的表单中将:ipv6_address更改为实际字段,即:ip_address。

总的来说,您的表单应如下所示:

<%= simple_form_for( @computer ) do |f| %>
<%= f.fields_for :ipv6_address do |v6| %>
<%= v6.input :ip_address, :collection => @ipv6s %>
<% end %>
<% f.button :submit %>
<% end %>