我有两个模型,它们在 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 中对象的完整列表。