【发布时间】:2012-09-16 08:22:32
【问题描述】:
我有两个模型,它们在 has_one / belongs_to 关联中链接;分别是计算机和 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
没有给出此错误的代码行参考,但仅当我将嵌套表单包含在计算机新表单中时才会出现。
关于导致它的原因或我如何更好地完成我正在做的事情的任何想法?
编辑:
事实证明,我需要在计算机模型中的 has_one :ipv6_address 行之后添加 accepts_nested_attributes_for :ipv6_address。
这解决了表单加载的问题。
根据 Yarden 的回答,我还对“ipv6_address”的所有实例进行了单数化,以反映 has_one 关系。
但是,一旦以新形式执行此操作,ipv6 字段就完全消失了。如果我不能很快解决这个问题,我会提出一个新问题。
【问题讨论】:
标签: ruby-on-rails associations nested-forms