2012-09-16 87 views
0

我有兩個模型鏈接在has_one/belongs_to關聯中;計算機和Ipv6Address分別。Rails - 嵌套表單fields_for不呈現

我已經預先填充了Ipv6Address表,並列出了我希望它具有的所有條目,現在我需要在計算機新/編輯表單上有一個下拉列表,以從Ipv6中選擇一個項目以將其與其關聯用。 需要預先填充的原因是,計算機可以與之相關聯的預定義的IPv6範圍,並且我希望它對於最終用戶來說只需從列表中盲選一些內容即可必須理解他們爲什麼這樣做;但要給任何知道選擇他們想要的機會的人。

到目前爲止,我所見過的所有內容似乎只在您在新窗體上同時創建兩個對象時才起作用,然後再編輯它們。

我試着根據我在網上找到的例子來設置我的MVC,並通過結算出類似主題上的其他stackoverflow問題。

計算機型號:

class Computer < ActiveRecord::Base 
    has_one :ipv6_address 
    accepts_nested_attributes_for :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_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的完整列表上的多個下拉選擇字段。

回答

1

看來你不想創建新的ivp6_addresses,你想要做的就是在計算機創建時建立計算機和地址之間的關聯。您可以使用第三個表來定義所有計算機/ ivp6關係,或者可以稍微調整模型定義。以下是如何在不添加第三個表的情況下執行此操作。

該關係可能看起來稍微向後一點,但rails會通過在computers表中找到ivp6_address_id來找到ipv6關聯。如果這是另一種方式,你會需要一個新的ivp6_address爲每個計算機創建,這不是你所說的你想要的。確保在計算機表中爲ivp6_address_id或您想要使用的任何外鍵都設置了適當的id列。

計算機型號:

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

Ipv6Address型號:

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 %> 
+0

一個很好的解決問題的方法,我記得簡要地想這樣做,但由於某種原因,它並沒有在我的腦海走到一起這麼好聽,我會看看我是否能在幾個小時內實現這個時間,然後將更新這篇文章。 – bdx

+0

工作出色,謝謝!這將幫助我清理另一個模型。 – bdx

+0

太棒了!很高興聽到:) –