2012-03-27 3 views
4

두 모델의 사용자 및 주소가 있습니다.중첩 된 양식 레일

class User < ActiveRecord::Base 
    has_many :addresses 
    accepts_nested_attributes_for :addresses 
end 

class Address < ActiveRecord::Base 
    belongs_to :user 
end 

내 컨트롤러

def new 
    @user = User.new 
    @user.addresses << Address.new 
    @user.addresses << Address.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    if @user.save 
     #do something 
    else 
     render 'new' 
    end 
    end 

그리고 내보기

<%= form_for @user do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
     <%= f.fields_for :addresses do |a| %> 
     <p> Home </p> 
     <%= a.text_field :state %> 
     <%= a.text_field :country%> 
     <%= a.text_field :street %> 
     <p> Work </p> 
     <%= a.text_field :state %> 
     <%= a.text_field :country%> 
     <%= a.text_field :street %> 
     <% end %> 
    <% end %> 
    <% end %> 

내 문제는 내가 PARAMS에 입력 마지막 주, 국가, 거리를 얻을 수있다.

"addresses_attributes"=>{"0"=>{"street"=>"test", "state"=>"test",, "country"=>"test"}, 
"1"=>{"street"=>"", "state"=>"", "country"=>""}} 

또한 더 좋은 방법이 있다면 어떤 제안을 주시면 감사하겠습니다.

+0

마지막으로 무엇을 의미합니까? 여기서 보여주는 결과물은 두 가지를 모두 받고 있음을 명확하게 보여줍니다. addresses_attributes [0] 및 addresses_attributes [1] – Faisal

+0

네,하지만 모든 필드를 채웠고 마지막 3 개만 보내졌습니다. – lesce

+0

예 : 처음 세 개의 필드는 'test0'으로 채워지고 마지막 세 개의 필드는 'test'로 채워집니다. – lesce

답변

5

rails APIfields_for이 주소 모음의 각 요소에 대해 자체적으로 반복 될 것이라고 말합니다.

주소 (직장, 집 등)에 일종의 레이블을 추가 할 것을 제안합니다. 그리고 그 자체로 작동해야합니다. 이 라벨을 사용하면 더 많은 주소를 추가 할 때 좀 더 유연 해집니다.

<%= f.fields_for :addresses, @user.addresses do |a| %> 
    <p> <%= a.object.label %> </p> 
    <%= a.text_field :state %> 
    <%= a.text_field :country%> 
    <%= a.text_field :street %> 
    <% end %> 
+0

나는 당신이 말한 것을 시도해 보았고 정의되지 않은 메서드 인'is_home_address '를 nil로 얻었습니다. NilClass 오류, 어떤 아이디어입니까? – lesce

+0

좀 더 자세한 정보를 제공해 주시겠습니까? 일부 라인 번호와 코드 arround이 번호? 나는 항상 오류를 추측하기가 아주 어렵다고 생각한다. P – klump

+0

ok @ user.addresses.each do | address |에 양식을 래핑하여 오류를 수정했다. 주소 객체를 fields_for에 추가하면 : 주소, 주소 .... 이제 객체에 액세스 할 수 있지만 매개 변수가 params [: user] [: address]를 변경하고 주소 중 하나만 전송됩니다. – lesce

3

fields_for : 주소가 이미 루프를 처리하므로 상태, 국가 및 거리를 반복 할 필요가 없습니다. 따라서 귀하의 경우, 당신은 다음 컨트롤러는 다음과 같이해야 새로운 분야 주소 유형을 추가 할 수 있습니다

def new 
    @user = User.new 
    @user.addresses.build(address_type: 'Home') 
    @user.addresses.build(address_type: 'Work') 
end 

을 그런 형태 :

<%= form_for @user do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    <%= f.fields_for :addresses do |a| %> 
     <%= a.hidden_field :address_type %> 
     <p><%= a.object.address_type %></p> 
     <%= a.text_field :state %> 
     <%= a.text_field :country%> 
     <%= a.text_field :street %> 
    <% end %> 
    <% end %> 
<% end %> 

a.object는 주소 객체를 참조하십시오.

+0

나는 당신이 말한 것을 시도해 보았고 정의되지 않은 메서드 인 'is_home_address'를 nil로 얻었습니다. NilClass 오류, 어떤 아이디어입니까? – lesce

+0

address_type을 db로 마이그레이션 했습니까? 양식을 방문 할 때 오류가 발생합니까? address_type에 숨겨진 필드를 추가하여 내 대답을 업데이트하여 db에 지속되도록했습니다. 그래도 문제가 지속되면 <% = debug a.object %>를 사용하여 디버깅하십시오. –

+0

예, 문제는 a.object가 nil이라는 것입니다. – lesce