【问题标题】:Rails - nested forms to link has_one's where the child object has already been createdRails - 嵌套表单链接 has_one 的子对象已经创建
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 啊,这只是我将它们复制到这里的错,这两个都已经存在于工作副本中。现在将编辑问题以反映这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多