1

我有两个模型,它们在 has_one / belongs_to 关联中链接;计算机和 IPv6Address 分别。

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

到目前为止,我在这方面看到的一切似乎只有在您在新表单上同时创建两个对象然后随后编辑它们时才有效。

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

电脑型号:

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

IPv6地址模型:

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 字段就完全消失了。如果我不能很快解决这个问题,我会提出一个新问题。

4

1 回答 1

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 %>
于 2012-09-16T08:33:57.660 回答