2016-11-10 3 views
0

simple_fields_for 입력을 다른 객체의 데이터로 미리 채울 수 있습니까?simple_form으로 중첩 된 요소 미리 채우기

나는 User 개체를 가지고 있습니다. Backpack 많은 Pockets을 가지고 User has_one Backpack, 그리고 Pocket has_many 내 양식을 구축 할 때 내가 users#new에있을 때, 내가 지금

<%= f.simple_fields_for :backpack do |backpack| %> 
     <%= render 'backpack', f:backpack %> 
    <% end %> 

을 사용하고 Items

는 전체 형태는 비어 있습니다. 다른 Backpack 개체의 데이터로 Backpack 필드를 초기화하고 싶습니다. 가능합니까? 내 UsersController이 함께

<%= f.simple_fields_for :backpack, @backpack do |backpack| %> 
     <%= render 'backpack', f:backpack %> 
    <% end %> 

: :이 작업을 수행하여 시도

@user = User.new 
@backpack = Backpack.find(1).deep_clone include: [ :pockets, { pockets: :items } ] 

하지만이 작동하지 않습니다 어떤 이유로 Backpack 필드는 자신의 PocketsItems를 작성되지만, 비어 있습니다. 나는 내 마음에 온 모든 것을 시도했다. 중첩 된 객체에 대한 내 경로를 확인하고, deep_cloning의 유무에 관계없이 시도했지만, 여전히 중첩 된 객체는 어디에도 없습니다. 따라서, 미리 채워진 양식을 미리 초기화하여 양식을 초기화 할 수 있습니다. 모델?

편집 : 그것은 내가 성공적으로 배낭을 복제한다는 것을 의미 주머니 타이틀을 모두 표시하는

<% @backpack.pockets.each do |pocket| %> 
    <%= pocket.title %> 
<% end %> 

를 넣어,하지만 어떤 이유로, 그래서, 사용,

확인 이 :

<%= f.simple_fields_for :pockets, @backpack.pockets do |pocket| %> 
    <%= render 'pocket', f: pocket %> 
<% end %> 

아무것도 표시되지 않습니다.

답변

0

좋아요, 복제본이 저장되지 않으므로 simple_fields_for을 미리 채우기 위해 직접 속성을 미리 채우는 데에만 사용되므로 중첩 된 모델이 없기 때문에 복제본을 저장해야합니다. 클론은 requestion의 PARAMS에서 그 속성을 제거하고 별도로

@backpack = Backpack.find(1).deep_clone include: [ :pockets, { pockets: :items } ] 
@backpack.save 

그것을 만든 다음의 Users#create 방법에

@user = User.new(user_params.except(:backpack_attributes)) 
@backpack = Backpack.new(params[:user][:backpack]) 
@backpack.save 
@user.backpack = @backpack 

이 방법을, 당신이 당신의 새로운 사용자를해야합니다, 당신의 형태는 것이다 t로 미리 채워져있다. 그는 배낭 속성과 중첩 속성을 배웁니다.