2012-09-16 4 views
0

has_one/belongs_to 연관에 연결된 두 개의 모델이 있습니다. 컴퓨터 및 Ipv6Address 각각.Rails - 중첩 된 양식 fields_ 렌더링하지 않음

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 관계를 정의하거나 모델 정의를 약간 조정할 수 있습니다. 다음은 세 번째 테이블을 추가하지 않고 수행하는 방법입니다.

관계는 문언에서 조금 뒤로 보일 수 있지만 레일스는 컴퓨터 테이블에서 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

굉장! 잘 듣고 :) –