0

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

我已经在 Ipv6Address 表中预先填充了我希望它拥有的所有条目,现在我需要在计算机新/编辑表单上有一个下拉列表,以从 Ipv6 中选择一个与之关联的项目。需要预先填充的原因是计算机可以与它们关联的 IPv6 的预定义范围,我希望最终用户尽可能容易地从列表中盲目地选择一些东西而无需了解他们为什么这样做;但是让任何知道这是什么的人都有机会选择他们想要的。

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

我尝试按照我在网上找到的示例设置我的 MVC,并查看有关类似主题的其他 stackoverflow 问题。

电脑型号:

class Computer < ActiveRecord::Base
  has_one :ipv6_address
  accepts_nested_attributes_for :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_address do |v6| %>
    <%= v6.input :ipv6_address, :collection => @ipv6s %>
  <% end %>
  <% f.button :submit %>
<% end %>

当这个新表单呈现时,没有包含 ipv6_address 的输入字段,尽管没有引发错误。我检查了渲染页面的来源,没有任何引用“ipv6”。

如果我将 fields_for 更改为:

<%= f.fields_for :ipv6_address, @ipv6s do |v6| %>

然后我在页面上出现多个下拉选择字段,每个对象对应一个,每个对象@ipv6s都包含@ipv6s 中对象的完整列表。

4

1 回答 1

1

似乎您不想创建新的 ivp6_addresses,您要做的就是在创建计算机时建立计算机和地址之间的关联。您可以使用第三个表来定义所有计算机/ivp6 关系,也可以稍微调整模型定义。下面是如何在不添加第三个表的情况下执行此操作。

这种关系在措辞上似乎有点倒退,但 rails 会通过在计算机表中找到 ivp6_address_id 来找到 ipv6 关联。如果是相反的方式,您将需要为每台创建的计算机创建一个新的 ivp6_address,这不是您所说的您想要的。确保您在计算机表中有适当的 id 列用于 ivp6_address_id 或您要使用的任何外键。

电脑型号:

class Computer < ActiveRecord::Base
  belongs_to :ipv6_address
  ...

IPv6地址模型:

class Ipv6Address < ActiveRecord::Base
  attr_accessible :ip_address
  has_many :computers
  ...

然后摆脱计算机表单中的嵌套字段,并在提交表单时添加以下行以建立关联。

<%= form_for( @computer ) do |f| %>
   <!--All the computer fields you need-->
  <%= collection_select(:computer, :ipv6_address_ids, Ipv6Address.all, :id, :ip_address, {}, { :multiple => true } )%>
  <% f.button :submit %>
<% end %>
于 2012-09-16T21:05:47.240 回答