1

오랫동안이 머리에 부딪 치고 있습니다. Rails 2.3.2에서 Ruby 1.9.1. 여기 3 개의 모델과 네임 스페이스를 가진 레일 형태

class Person 
    has_one :goat 
end 

class Goat 
    belongs_to :person 
    has_many :kids 
end 

class Goat::Kid 
    belongs_to :goat 
end 

스키마의 요약이다 :

이 관계를 가지고 세 개의 객체를 생성 한 양식을 사용하려고

Person 
    first_name 
    last_name 
Goat 
    name 
    color 
Goat::Kid 
    nickname 
    age 

나는 새로운 인스턴스를 인스턴스화 내 #create 조치를하고 싶습니다 지정된 연관성을 가진 세 모델의 그러나 내 params 해시가 컨트롤러에 전달되는 것처럼 보일 때 (브라우저가 폭발 할 때 브라우저의 백 트레이스 로그를 기반으로 함) Goat::Kid 개체는 매개 변수를 수집하지 않습니다.

irb (irb 세션은 #save! 또는 다른 필수품이 아니라면 그렇게하기 위해 노력하고있는 표현입니다.이 모든 것을 수행하려고합니다. 브라우저/웹 양식을 통해.) 이제

a = Person.new :first_name => 'Leopold', :last_name => 'Bloom' 
b = Goat.new :name => 'Billy', :color => 'white' 
c = Goat::Kid.new :nickname => 'Jr.', :age => 2 

a.goat.kids 

>> [] 

, 나는 각 개체에 PARAMS를 전달하는 뷰를 얻는 방법을 알아낼 수 없습니다와 DB 이러한 PARAMS을 저장하기 위해 컨트롤러를 얻을 수 있습니다.

내 질문 : A) nested_attributes_for을 사용하는 좋은 장소이며, 그렇다면 네임 스페이스로 어떻게 선언 할 수 있습니까? B)이 작업을 훨씬 더 간단하고 쉽게 이해할 수 있습니까?

세 모델에 매개 변수를 전달하는 것은 나에게 매우 어려웠으며 아무리 많은 문서를 읽었는지간에 머리를 감쌀 수는 없습니다 (#form_for#fields_for). 네임 스페이스는 이것을 더욱 복잡하게 만든다. 어떤 도움을 주셔서 감사합니다!


부록 : 나는

accepts_nested_attributes_for 

이름 공간에서 모델의 기호 인수를 사용하는 적절한 방법은 무엇입니까 선언 끝날 경우?

accepts_nested_attributes_for :kids, :through => :goats 

또는

accepts_nested_attributes_for :goats_kids, :through => :goats 

또는

accepts_nested_attributes_for :goats::kids, :through => :goats 

나는 네임 스페이스 모델은 자신의 기호 식별자로 변환하는 방법을 모르겠어요. 감사!

+0

너무 명확하지 않은지 잘 모르겠습니다.
사람 이름 :
사람 성 :
염소 이름 :
염소 색상 : 여기에 내가보고 내 양식을하고 싶습니다 방법
염소 :: 아이를 닉네임 :
염소 :: 아이 나이 :
그래서,이 하나 개의 형태는 것 적절한 연관과 네임 스페이스 고려 사항을 가진 3 개의 새로운 모델을 생성하십시오. 예. –

+0

염소가 있습니까? wtf? lol – JRL

+0

예, 이번 Goatr 앱입니다. 아니요.이 모델은 무고한 사람을 보호하기 위해 가상의 것입니다. 이것은 네임 스페이스를 사용하여 생각할 수있는 유일한 예입니다. –

답변

2

글쎄, 이것은 내 처음으로 으로 노는 것이지만 주위를 조금만 돌아다 보면 나는 뭔가를 얻을 수있었습니다.

우선 모델 설정 : 간단한로운 컨트롤러

class Person < ActiveRecord::Base 
    has_one :goat 
    accepts_nested_attributes_for :goat 
end 

class Goat < ActiveRecord::Base 
    belongs_to :person 
    has_many :kids 

    accepts_nested_attributes_for :kids 
end 

class Goat::Kid < ActiveRecord::Base 
    belongs_to :goat 
end 

:

다음 형태 셋업 :

ActionController::Routing::Routes.draw do |map| 
    map.resources :farm 
end 

class FarmController < ApplicationController 
    def new 
    end 

    def create 
    person = Person.new params[:person] 
    person.save 
    render :text => person.inspect 
    end 
end 

나서 반 복잡한 형태 온다

<% form_for :person, :url => farm_index_path do |p| %> 
    <%= p.label :first_name %>: <%= p.text_field :first_name %><br /> 
    <%= p.label :last_name %>: <%= p.text_field :last_name %><br /> 
    <% p.fields_for :goat_attributes do |g| %> 
    <%= g.label :name %>: <%= g.text_field :name %><br /> 
    <%= g.label :color %>: <%= g.text_field :color %><br /> 
    <% g.fields_for 'kids_attributes[]', Goat::Kid.new do |k| %> 
     <%= k.label :nickname %>: <%= k.text_field :nickname %><br /> 
     <%= k.label :age %>: <%= k.text_field :age %><br /> 
    <% end %> 
    <% end %> 
    <%= p.submit %> 
<% end %> 

에 대한 소스를 보면 #{attr_name}_attributes=이라는 메서드가 만들어 졌으므로 해당 (레일 2.3.3)을 반영하도록 fields_for을 설정해야했습니다. 다음으로 has_many :kidsaccepts_nested_attributes_for과 작동하도록하십시오. kids_attributes= 메서드는 객체 배열을 찾고 있었기 때문에 배열 연관을 수동으로 지정하고 fields_for에 사용할 모델 유형을 지정해야했습니다.

희망이 도움이됩니다.

+0

Heya, Michael, 나는 당신의 제안을 고맙게 여긴다. 그러나 구현은 나에게 완전히 이해할 수없는 NoMethodError를 던졌다. 정말 감사. (이 계정에 로그인하는 데 문제가있어서 아래에 의견을 남겼습니다) –

관련 문제