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